mirror of https://git.ffmpeg.org/ffmpeg.git
Parse DEFINESOUND tags in swf (fix ticket 1638)
Signed-off-by: Michael Bradshaw <mbradshaw@sorensonmedia.com> Signed-off-by: Michael Niedermayer <michaelni@gmx.at>
This commit is contained in:
parent
a51540d811
commit
a41c824c53
|
@ -44,6 +44,7 @@
|
|||
#define TAG_FREECHARACTER 3
|
||||
#define TAG_PLACEOBJECT 4
|
||||
#define TAG_REMOVEOBJECT 5
|
||||
#define TAG_DEFINESOUND 14
|
||||
#define TAG_STREAMHEAD 18
|
||||
#define TAG_STREAMBLOCK 19
|
||||
#define TAG_JPEG2 21
|
||||
|
|
|
@ -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;
|
||||
|
|
Loading…
Reference in New Issue