From 6cac3a3b0812e945d7a5d42f5bf5e99332df34e7 Mon Sep 17 00:00:00 2001 From: Allan Hsu Date: Wed, 6 Dec 2006 00:23:04 +0000 Subject: Defines various common FLV format values between the FLV muxer and demuxer in a common flv.h. patch by Allan Hsu allan _at_ counterpop.net Originally committed as revision 7231 to svn://svn.ffmpeg.org/ffmpeg/trunk --- libavformat/flvdec.c | 53 ++++++++++++++++++++++++++-------------------------- 1 file changed, 27 insertions(+), 26 deletions(-) (limited to 'libavformat/flvdec.c') diff --git a/libavformat/flvdec.c b/libavformat/flvdec.c index a1c2aa4eb2..1954ce5dcf 100644 --- a/libavformat/flvdec.c +++ b/libavformat/flvdec.c @@ -25,6 +25,7 @@ * - lower 4bits: difference between encoded height and visible height */ #include "avformat.h" +#include "flv.h" static int flv_probe(AVProbeData *p) { @@ -90,13 +91,13 @@ static int flv_read_packet(AVFormatContext *s, AVPacket *pkt) next= size + url_ftell(&s->pb); - if (type == 8) { + if (type == FLV_TAG_TYPE_AUDIO) { is_audio=1; flags = get_byte(&s->pb); - } else if (type == 9) { + } else if (type == FLV_TAG_TYPE_VIDEO) { is_audio=0; flags = get_byte(&s->pb); - } else if (type == 18 && size > 13+1+4) { + } else if (type == FLV_TAG_TYPE_META && size > 13+1+4) { url_fskip(&s->pb, 13); //onMetaData blah if(get_byte(&s->pb) == 8){ url_fskip(&s->pb, 4); @@ -113,17 +114,17 @@ static int flv_read_packet(AVFormatContext *s, AVPacket *pkt) tmp[len]=0; type= get_byte(&s->pb); - if(type==0){ + if(type == AMF_DATA_TYPE_NUMBER){ d= av_int2dbl(get_be64(&s->pb)); - }else if(type==2){ + }else if(type == AMF_DATA_TYPE_STRING){ len= get_be16(&s->pb); if(len >= sizeof(tmp)) break; url_fskip(&s->pb, len); - }else if(type==8){ + }else if(type == AMF_DATA_TYPE_MIXEDARRAY){ //array break; - }else if(type==11){ + }else if(type == AMF_DATA_TYPE_DATE){ d= av_int2dbl(get_be64(&s->pb)); get_be16(&s->pb); } @@ -158,14 +159,14 @@ static int flv_read_packet(AVFormatContext *s, AVPacket *pkt) st->codec->time_base= (AVRational){1,1000}; } // av_log(NULL, AV_LOG_DEBUG, "%d %X %d \n", is_audio, flags, st->discard); - if( (st->discard >= AVDISCARD_NONKEY && !((flags >> 4)==1 || is_audio)) - ||(st->discard >= AVDISCARD_BIDIR && ((flags >> 4)==3 && !is_audio)) + if( (st->discard >= AVDISCARD_NONKEY && !((flags & FLV_VIDEO_FRAMETYPE_MASK) == FLV_FRAME_KEY || is_audio)) + ||(st->discard >= AVDISCARD_BIDIR && ((flags & FLV_VIDEO_FRAMETYPE_MASK) == FLV_FRAME_DISP_INTER && !is_audio)) || st->discard >= AVDISCARD_ALL ){ url_fseek(&s->pb, next, SEEK_SET); continue; } - if ((flags >> 4)==1) + if ((flags & FLV_VIDEO_FRAMETYPE_MASK) == FLV_FRAME_KEY) av_add_index_entry(st, pos, pts, size, 0, AVINDEX_KEYFRAME); break; } @@ -173,31 +174,31 @@ static int flv_read_packet(AVFormatContext *s, AVPacket *pkt) if(is_audio){ if(st->codec->sample_rate == 0){ st->codec->codec_type = CODEC_TYPE_AUDIO; - st->codec->channels = (flags&1)+1; - if((flags >> 4) == 5) + st->codec->channels = (flags & FLV_AUDIO_CHANNEL_MASK) == FLV_STEREO ? 2 : 1; + if((flags & FLV_AUDIO_CODECID_MASK) == FLV_CODECID_NELLYMOSER_8HZ_MONO) st->codec->sample_rate= 8000; else - st->codec->sample_rate = (44100<<((flags>>2)&3))>>3; - switch(flags >> 4){/* 0: uncompressed 1: ADPCM 2: mp3 5: Nellymoser 8kHz mono 6: Nellymoser*/ - case 0: if (flags&2) st->codec->codec_id = CODEC_ID_PCM_S16BE; + st->codec->sample_rate = (44100 << ((flags & FLV_AUDIO_SAMPLERATE_MASK) >> FLV_AUDIO_SAMPLERATE_OFFSET) >> 3); + switch(flags & FLV_AUDIO_CODECID_MASK) { + case FLV_CODECID_PCM_BE: if (flags & FLV_AUDIO_SAMPLESIZE_MASK) st->codec->codec_id = CODEC_ID_PCM_S16BE; else st->codec->codec_id = CODEC_ID_PCM_S8; break; - case 1: st->codec->codec_id = CODEC_ID_ADPCM_SWF; break; - case 2: st->codec->codec_id = CODEC_ID_MP3; st->need_parsing = 1; break; + case FLV_CODECID_ADPCM : st->codec->codec_id = CODEC_ID_ADPCM_SWF; break; + case FLV_CODECID_MP3 : st->codec->codec_id = CODEC_ID_MP3 ; st->need_parsing = 1; break; // this is not listed at FLV but at SWF, strange... - case 3: if (flags&2) st->codec->codec_id = CODEC_ID_PCM_S16LE; + case FLV_CODECID_PCM_LE: if (flags & FLV_AUDIO_SAMPLESIZE_MASK) st->codec->codec_id = CODEC_ID_PCM_S16LE; else st->codec->codec_id = CODEC_ID_PCM_S8; break; default: av_log(s, AV_LOG_INFO, "Unsupported audio codec (%x)\n", flags >> 4); st->codec->codec_tag= (flags >> 4); } - st->codec->bits_per_sample = (flags & 2) ? 16 : 8; + st->codec->bits_per_sample = (flags & FLV_AUDIO_SAMPLESIZE_MASK) ? 16 : 8; } }else{ st->codec->codec_type = CODEC_TYPE_VIDEO; - switch(flags & 0xF){ - case 2: st->codec->codec_id = CODEC_ID_FLV1; break; - case 3: st->codec->codec_id = CODEC_ID_FLASHSV; break; - case 4: + switch(flags & FLV_VIDEO_CODECID_MASK){ + case FLV_CODECID_H263 : st->codec->codec_id = CODEC_ID_FLV1 ; break; + case FLV_CODECID_SCREEN: st->codec->codec_id = CODEC_ID_FLASHSV; break; + case FLV_CODECID_VP6 : st->codec->codec_id = CODEC_ID_VP6F; if (st->codec->extradata_size != 1) { st->codec->extradata_size = 1; @@ -208,8 +209,8 @@ static int flv_read_packet(AVFormatContext *s, AVPacket *pkt) size--; break; default: - av_log(s, AV_LOG_INFO, "Unsupported video codec (%x)\n", flags & 0xf); - st->codec->codec_tag= flags & 0xF; + av_log(s, AV_LOG_INFO, "Unsupported video codec (%x)\n", flags & FLV_VIDEO_CODECID_MASK); + st->codec->codec_tag = flags & FLV_VIDEO_CODECID_MASK; } } @@ -223,7 +224,7 @@ static int flv_read_packet(AVFormatContext *s, AVPacket *pkt) pkt->pts = pts; pkt->stream_index = st->index; - if (is_audio || ((flags >> 4)==1)) + if (is_audio || ((flags & FLV_VIDEO_FRAMETYPE_MASK) == FLV_FRAME_KEY)) pkt->flags |= PKT_FLAG_KEY; return ret; -- cgit v1.2.3