diff options
author | Justin Ruggles <justin.ruggles@gmail.com> | 2011-09-21 11:34:26 -0400 |
---|---|---|
committer | Justin Ruggles <justin.ruggles@gmail.com> | 2011-10-11 07:48:16 -0400 |
commit | a7984a6a6dbdfbd95df4a669a452ddf34c485cab (patch) | |
tree | d9712e645d6ed9da8a9f03767c23a3a0c27d9d7c | |
parent | be1242a3f2b28e9cb08515bdc1db6c14403c279a (diff) | |
download | ffmpeg-a7984a6a6dbdfbd95df4a669a452ddf34c485cab.tar.gz |
smacker: Separate audio flags from sample rates in smacker demuxer.
Makes the code easier to understand.
-rw-r--r-- | libavformat/smacker.c | 31 |
1 files changed, 17 insertions, 14 deletions
diff --git a/libavformat/smacker.c b/libavformat/smacker.c index 995ef41a4e..447e6e67c4 100644 --- a/libavformat/smacker.c +++ b/libavformat/smacker.c @@ -31,11 +31,11 @@ #define SMACKER_FLAG_RING_FRAME 0x01 enum SAudFlags { - SMK_AUD_PACKED = 0x80000000, - SMK_AUD_16BITS = 0x20000000, - SMK_AUD_STEREO = 0x10000000, - SMK_AUD_BINKAUD = 0x08000000, - SMK_AUD_USEDCT = 0x04000000 + SMK_AUD_PACKED = 0x80, + SMK_AUD_16BITS = 0x20, + SMK_AUD_STEREO = 0x10, + SMK_AUD_BINKAUD = 0x08, + SMK_AUD_USEDCT = 0x04 }; typedef struct SmackerContext { @@ -48,6 +48,7 @@ typedef struct SmackerContext { uint32_t audio[7]; uint32_t treesize; uint32_t mmap_size, mclr_size, full_size, type_size; + uint8_t aflags[7]; uint32_t rates[7]; uint32_t pad; /* frame info */ @@ -129,8 +130,10 @@ static int smacker_read_header(AVFormatContext *s, AVFormatParameters *ap) smk->mclr_size = avio_rl32(pb); smk->full_size = avio_rl32(pb); smk->type_size = avio_rl32(pb); - for(i = 0; i < 7; i++) - smk->rates[i] = avio_rl32(pb); + for(i = 0; i < 7; i++) { + smk->rates[i] = avio_rl24(pb); + smk->aflags[i] = avio_r8(pb); + } smk->pad = avio_rl32(pb); /* setup data */ if(smk->frames > 0xFFFFFF) { @@ -173,23 +176,23 @@ static int smacker_read_header(AVFormatContext *s, AVFormatParameters *ap) /* handle possible audio streams */ for(i = 0; i < 7; i++) { smk->indexes[i] = -1; - if(smk->rates[i] & 0xFFFFFF){ + if (smk->rates[i]) { ast[i] = av_new_stream(s, 0); smk->indexes[i] = ast[i]->index; ast[i]->codec->codec_type = AVMEDIA_TYPE_AUDIO; - if (smk->rates[i] & SMK_AUD_BINKAUD) { + if (smk->aflags[i] & SMK_AUD_BINKAUD) { ast[i]->codec->codec_id = CODEC_ID_BINKAUDIO_RDFT; - } else if (smk->rates[i] & SMK_AUD_USEDCT) { + } else if (smk->aflags[i] & SMK_AUD_USEDCT) { ast[i]->codec->codec_id = CODEC_ID_BINKAUDIO_DCT; - } else if (smk->rates[i] & SMK_AUD_PACKED){ + } else if (smk->aflags[i] & SMK_AUD_PACKED){ ast[i]->codec->codec_id = CODEC_ID_SMACKAUDIO; ast[i]->codec->codec_tag = MKTAG('S', 'M', 'K', 'A'); } else { ast[i]->codec->codec_id = CODEC_ID_PCM_U8; } - ast[i]->codec->channels = (smk->rates[i] & SMK_AUD_STEREO) ? 2 : 1; - ast[i]->codec->sample_rate = smk->rates[i] & 0xFFFFFF; - ast[i]->codec->bits_per_coded_sample = (smk->rates[i] & SMK_AUD_16BITS) ? 16 : 8; + ast[i]->codec->channels = (smk->aflags[i] & SMK_AUD_STEREO) ? 2 : 1; + ast[i]->codec->sample_rate = smk->rates[i]; + ast[i]->codec->bits_per_coded_sample = (smk->aflags[i] & SMK_AUD_16BITS) ? 16 : 8; if(ast[i]->codec->bits_per_coded_sample == 16 && ast[i]->codec->codec_id == CODEC_ID_PCM_U8) ast[i]->codec->codec_id = CODEC_ID_PCM_S16LE; av_set_pts_info(ast[i], 64, 1, ast[i]->codec->sample_rate |