aboutsummaryrefslogtreecommitdiffstats
path: root/libavformat/swfdec.c
diff options
context:
space:
mode:
authorMichael Bradshaw <mbradshaw@sorensonmedia.com>2012-10-11 19:48:44 -0600
committerMichael Niedermayer <michaelni@gmx.at>2012-10-12 17:37:34 +0200
commita41c824c539cc1fe79b3afd9393a91d22a8065da (patch)
tree75781289b6793195c777cae791fc47e8d8bd476d /libavformat/swfdec.c
parenta51540d81167547f1c7c2b8f545c246711611071 (diff)
downloadandroid_external_ffmpeg-a41c824c539cc1fe79b3afd9393a91d22a8065da.tar.gz
android_external_ffmpeg-a41c824c539cc1fe79b3afd9393a91d22a8065da.tar.bz2
android_external_ffmpeg-a41c824c539cc1fe79b3afd9393a91d22a8065da.zip
Parse DEFINESOUND tags in swf (fix ticket 1638)
Signed-off-by: Michael Bradshaw <mbradshaw@sorensonmedia.com> Signed-off-by: Michael Niedermayer <michaelni@gmx.at>
Diffstat (limited to 'libavformat/swfdec.c')
-rw-r--r--libavformat/swfdec.c38
1 files changed, 38 insertions, 0 deletions
diff --git a/libavformat/swfdec.c b/libavformat/swfdec.c
index 3967d82ef3..8a57a34d04 100644
--- a/libavformat/swfdec.c
+++ b/libavformat/swfdec.c
@@ -200,6 +200,44 @@ static int swf_read_packet(AVFormatContext *s, AVPacket *pkt)
ast->codec->sample_rate = 44100 >> (3 - sample_rate_code);
avpriv_set_pts_info(ast, 64, 1, ast->codec->sample_rate);
len -= 4;
+ } else if (tag == TAG_DEFINESOUND) {
+ /* audio stream */
+ int sample_rate_code;
+ int ch_id = avio_rl16(pb);
+
+ for (i=0; i<s->nb_streams; i++) {
+ st = s->streams[i];
+ if (st->codec->codec_type == AVMEDIA_TYPE_AUDIO && st->id == ch_id)
+ goto skip;
+ }
+
+ // FIXME: 8-bit uncompressed PCM audio will be interpreted as 16-bit
+ // FIXME: The entire audio stream is stored in a single chunk/tag. Normally,
+ // these are smaller audio streams in DEFINESOUND tags, but it's technically
+ // possible they could be huge. Break it up into multiple packets if it's big.
+ v = avio_r8(pb);
+ ast = avformat_new_stream(s, NULL);
+ if (!ast)
+ return -1;
+ ast->id = ch_id;
+ ast->codec->channels = 1 + (v&1);
+ ast->codec->codec_type = AVMEDIA_TYPE_AUDIO;
+ ast->codec->codec_id = ff_codec_get_id(swf_audio_codec_tags, (v>>4) & 15);
+ ast->need_parsing = AVSTREAM_PARSE_FULL;
+ sample_rate_code= (v>>2) & 3;
+ ast->codec->sample_rate = 44100 >> (3 - sample_rate_code);
+ avpriv_set_pts_info(ast, 64, 1, ast->codec->sample_rate);
+ ast->duration = avio_rl32(pb); // number of samples
+ if (((v>>4) & 15) == 2) { // MP3 sound data record
+ ast->skip_samples = avio_rl16(pb);
+ len -= 2;
+ }
+ len -= 7;
+ if ((res = av_get_packet(pb, pkt, len)) < 0)
+ return res;
+ pkt->pos = pos;
+ pkt->stream_index = ast->index;
+ return pkt->size;
} else if (tag == TAG_VIDEOFRAME) {
int ch_id = avio_rl16(pb);
len -= 2;