summaryrefslogtreecommitdiff
path: root/libavformat/4xm.c
diff options
context:
space:
mode:
authorMichael Niedermayer <michaelni@gmx.at>2009-01-27 22:14:48 +0000
committerMichael Niedermayer <michaelni@gmx.at>2009-01-27 22:14:48 +0000
commit9913860bfb09562b88e3b878606955dd1f886015 (patch)
tree6267226dbe83333a4a344215192f0c7e9d02ef04 /libavformat/4xm.c
parentc58d6796a11686feb110cfb034bcf9964d69a4f1 (diff)
Export all tracks (each is a different language) instead of just one.
Originally committed as revision 16836 to svn://svn.ffmpeg.org/ffmpeg/trunk
Diffstat (limited to 'libavformat/4xm.c')
-rw-r--r--libavformat/4xm.c26
1 files changed, 12 insertions, 14 deletions
diff --git a/libavformat/4xm.c b/libavformat/4xm.c
index 17fe7c493d..f3b1f192a4 100644
--- a/libavformat/4xm.c
+++ b/libavformat/4xm.c
@@ -66,6 +66,7 @@ typedef struct AudioTrack {
int channels;
int stream_index;
int adpcm;
+ int64_t audio_pts;
} AudioTrack;
typedef struct FourxmDemuxContext {
@@ -74,9 +75,7 @@ typedef struct FourxmDemuxContext {
int video_stream_index;
int track_count;
AudioTrack *tracks;
- int selected_track;
- int64_t audio_pts;
int64_t video_pts;
float fps;
} FourxmDemuxContext;
@@ -104,7 +103,6 @@ static int fourxm_read_header(AVFormatContext *s,
fourxm->track_count = 0;
fourxm->tracks = NULL;
- fourxm->selected_track = 0;
fourxm->fps = 1.0;
/* skip the first 3 32-bit numbers */
@@ -185,6 +183,7 @@ static int fourxm_read_header(AVFormatContext *s,
fourxm->tracks[current_track].channels = AV_RL32(&header[i + 36]);
fourxm->tracks[current_track].sample_rate = AV_RL32(&header[i + 40]);
fourxm->tracks[current_track].bits = AV_RL32(&header[i + 44]);
+ fourxm->tracks[current_track].audio_pts = 0;
i += 8 + size;
/* allocate a new AVStream */
@@ -225,7 +224,6 @@ static int fourxm_read_header(AVFormatContext *s,
av_free(header);
/* initialize context members */
fourxm->video_pts = -1; /* first frame will push to 0 */
- fourxm->audio_pts = 0;
return 0;
fail:
@@ -242,7 +240,7 @@ static int fourxm_read_packet(AVFormatContext *s,
unsigned int fourcc_tag;
unsigned int size, out_size;
int ret = 0;
- int track_number;
+ unsigned int track_number;
int packet_read = 0;
unsigned char header[8];
int audio_frame_count;
@@ -292,28 +290,28 @@ static int fourxm_read_packet(AVFormatContext *s,
out_size= get_le32(pb);
size-=8;
- if (track_number == fourxm->selected_track) {
+ if (track_number < fourxm->track_count) {
ret= av_get_packet(s->pb, pkt, size);
if(ret<0)
return AVERROR(EIO);
pkt->stream_index =
- fourxm->tracks[fourxm->selected_track].stream_index;
- pkt->pts = fourxm->audio_pts;
+ fourxm->tracks[track_number].stream_index;
+ pkt->pts = fourxm->tracks[track_number].audio_pts;
packet_read = 1;
/* pts accounting */
audio_frame_count = size;
- if (fourxm->tracks[fourxm->selected_track].adpcm)
+ if (fourxm->tracks[track_number].adpcm)
audio_frame_count -=
- 2 * (fourxm->tracks[fourxm->selected_track].channels);
+ 2 * (fourxm->tracks[track_number].channels);
audio_frame_count /=
- fourxm->tracks[fourxm->selected_track].channels;
- if (fourxm->tracks[fourxm->selected_track].adpcm)
+ fourxm->tracks[track_number].channels;
+ if (fourxm->tracks[track_number].adpcm)
audio_frame_count *= 2;
else
audio_frame_count /=
- (fourxm->tracks[fourxm->selected_track].bits / 8);
- fourxm->audio_pts += audio_frame_count;
+ (fourxm->tracks[track_number].bits / 8);
+ fourxm->tracks[track_number].audio_pts += audio_frame_count;
} else {
url_fseek(pb, size, SEEK_CUR);