summaryrefslogtreecommitdiff
diff options
context:
space:
mode:
authorSven Hesse <drmccoy@drmccoy.de>2011-08-18 18:37:14 +0200
committerMichael Niedermayer <michaelni@gmx.at>2011-08-18 23:53:44 +0200
commit6fb501245d0eacd9c0207367906afb5cc08baa79 (patch)
treea35b4313c02f35416f34a38565e75e650e9eff75
parentd50fc62ea2c2be2d9c7858e688f6bdfcf984ba34 (diff)
xmv: Merge XMVAudioTrack into XMVAudioPacket
Signed-off-by: Michael Niedermayer <michaelni@gmx.at>
-rw-r--r--libavformat/xmv.c88
1 files changed, 37 insertions, 51 deletions
diff --git a/libavformat/xmv.c b/libavformat/xmv.c
index 05ebe41974..87fd38e6d9 100644
--- a/libavformat/xmv.c
+++ b/libavformat/xmv.c
@@ -42,19 +42,6 @@
XMV_AUDIO_ADPCM51_FRONTCENTERLOW | \
XMV_AUDIO_ADPCM51_REARLEFTRIGHT)
-typedef struct XMVAudioTrack {
- uint16_t compression;
- uint16_t channels;
- uint32_t sample_rate;
- uint16_t bits_per_sample;
- uint32_t bit_rate;
- uint16_t flags;
- uint16_t block_align;
- uint16_t block_samples;
-
- enum CodecID codec_id;
-} XMVAudioTrack;
-
typedef struct XMVVideoPacket {
/* The decoder stream index for this video packet. */
int stream_index;
@@ -79,8 +66,16 @@ typedef struct XMVAudioPacket {
/* The decoder stream index for this audio packet. */
int stream_index;
- /* The audio track this packet encodes. */
- XMVAudioTrack *track;
+ uint16_t compression;
+ uint16_t channels;
+ uint32_t sample_rate;
+ uint16_t bits_per_sample;
+ uint32_t bit_rate;
+ uint16_t flags;
+ uint16_t block_align;
+ uint16_t block_samples;
+
+ enum CodecID codec_id;
uint32_t data_size;
uint64_t data_offset;
@@ -93,8 +88,6 @@ typedef struct XMVAudioPacket {
typedef struct XMVDemuxContext {
uint16_t audio_track_count;
- XMVAudioTrack *audio_tracks;
-
uint32_t this_packet_size;
uint32_t next_packet_size;
@@ -172,34 +165,28 @@ static int xmv_read_header(AVFormatContext *s,
avio_skip(pb, 2); /* Unknown (padding?) */
- xmv->audio_tracks = av_malloc(xmv->audio_track_count * sizeof(XMVAudioTrack));
- if (!xmv->audio_tracks)
- return AVERROR(ENOMEM);
-
xmv->audio = av_malloc(xmv->audio_track_count * sizeof(XMVAudioPacket));
if (!xmv->audio)
return AVERROR(ENOMEM);
for (audio_track = 0; audio_track < xmv->audio_track_count; audio_track++) {
- XMVAudioTrack *track = &xmv->audio_tracks[audio_track];
- XMVAudioPacket *packet = &xmv->audio [audio_track];
+ XMVAudioPacket *packet = &xmv->audio[audio_track];
AVStream *ast = NULL;
- track->compression = avio_rl16(pb);
- track->channels = avio_rl16(pb);
- track->sample_rate = avio_rl32(pb);
- track->bits_per_sample = avio_rl16(pb);
- track->flags = avio_rl16(pb);
-
- track->bit_rate = track->bits_per_sample *
- track->sample_rate *
- track->channels;
- track->block_align = 36 * track->channels;
- track->block_samples = 64;
- track->codec_id = ff_wav_codec_get_id(track->compression,
- track->bits_per_sample);
-
- packet->track = track;
+ packet->compression = avio_rl16(pb);
+ packet->channels = avio_rl16(pb);
+ packet->sample_rate = avio_rl32(pb);
+ packet->bits_per_sample = avio_rl16(pb);
+ packet->flags = avio_rl16(pb);
+
+ packet->bit_rate = packet->bits_per_sample *
+ packet->sample_rate *
+ packet->channels;
+ packet->block_align = 36 * packet->channels;
+ packet->block_samples = 64;
+ packet->codec_id = ff_wav_codec_get_id(packet->compression,
+ packet->bits_per_sample);
+
packet->stream_index = -1;
packet->frame_size = 0;
@@ -207,24 +194,24 @@ static int xmv_read_header(AVFormatContext *s,
/* TODO: ADPCM'd 5.1 sound is encoded in three separate streams.
* Those need to be interleaved to a proper 5.1 stream. */
- if (track->flags & XMV_AUDIO_ADPCM51)
+ if (packet->flags & XMV_AUDIO_ADPCM51)
av_log(s, AV_LOG_WARNING, "Unsupported 5.1 ADPCM audio stream "
- "(0x%04X)\n", track->flags);
+ "(0x%04X)\n", packet->flags);
ast = av_new_stream(s, audio_track);
if (!ast)
return AVERROR(ENOMEM);
ast->codec->codec_type = AVMEDIA_TYPE_AUDIO;
- ast->codec->codec_id = track->codec_id;
- ast->codec->codec_tag = track->compression;
- ast->codec->channels = track->channels;
- ast->codec->sample_rate = track->sample_rate;
- ast->codec->bits_per_coded_sample = track->bits_per_sample;
- ast->codec->bit_rate = track->bit_rate;
- ast->codec->block_align = 36 * track->channels;
+ ast->codec->codec_id = packet->codec_id;
+ ast->codec->codec_tag = packet->compression;
+ ast->codec->channels = packet->channels;
+ ast->codec->sample_rate = packet->sample_rate;
+ ast->codec->bits_per_coded_sample = packet->bits_per_sample;
+ ast->codec->bit_rate = packet->bit_rate;
+ ast->codec->block_align = 36 * packet->channels;
- av_set_pts_info(ast, 32, track->block_samples, track->sample_rate);
+ av_set_pts_info(ast, 32, packet->block_samples, packet->sample_rate);
packet->stream_index = ast->index;
@@ -339,7 +326,7 @@ static int xmv_process_packet_header(AVFormatContext *s)
/** Carve up the audio data in frame_count slices */
packet->frame_size = packet->data_size / xmv->video.frame_count;
- packet->frame_size -= packet->frame_size % packet->track->block_align;
+ packet->frame_size -= packet->frame_size % packet->block_align;
}
/* Packet data offsets */
@@ -443,7 +430,7 @@ static int xmv_fetch_audio_packet(AVFormatContext *s,
/* Calculate the PTS */
- block_count = data_size / audio->track->block_align;
+ block_count = data_size / audio->block_align;
pkt->duration = block_count;
pkt->pts = audio->block_count;
@@ -560,7 +547,6 @@ static int xmv_read_close(AVFormatContext *s)
XMVDemuxContext *xmv = s->priv_data;
av_free(xmv->audio);
- av_free(xmv->audio_tracks);
return 0;
}