comparison flvdec.c @ 2571:41fefa61d999 libavformat

revert r10527 There is now a proper vp6a codec, so no need for this hack anymore.
author aurel
date Tue, 25 Sep 2007 19:25:59 +0000
parents 74c1aa100084
children aabd822b5db5
comparison
equal deleted inserted replaced
2570:b0a253d7d0f7 2571:41fefa61d999
23 * License along with FFmpeg; if not, write to the Free Software 23 * License along with FFmpeg; if not, write to the Free Software
24 * Foundation, Inc., 51 Franklin Street, Fifth Floor, Boston, MA 02110-1301 USA 24 * Foundation, Inc., 51 Franklin Street, Fifth Floor, Boston, MA 02110-1301 USA
25 */ 25 */
26 #include "avformat.h" 26 #include "avformat.h"
27 #include "flv.h" 27 #include "flv.h"
28
29 typedef struct {
30 AVStream *alpha_stream;
31 int pts;
32 int flags;
33 int alpha_size;
34 } FLVContext;
35 28
36 static int flv_probe(AVProbeData *p) 29 static int flv_probe(AVProbeData *p)
37 { 30 {
38 const uint8_t *d; 31 const uint8_t *d;
39 32
62 acodec->codec_tag = flv_codecid >> FLV_AUDIO_CODECID_OFFSET; 55 acodec->codec_tag = flv_codecid >> FLV_AUDIO_CODECID_OFFSET;
63 } 56 }
64 } 57 }
65 58
66 static int flv_set_video_codec(AVFormatContext *s, AVStream *vstream, int flv_codecid) { 59 static int flv_set_video_codec(AVFormatContext *s, AVStream *vstream, int flv_codecid) {
67 FLVContext *flv = s->priv_data;
68 AVCodecContext *vcodec = vstream->codec; 60 AVCodecContext *vcodec = vstream->codec;
69 switch(flv_codecid) { 61 switch(flv_codecid) {
70 case FLV_CODECID_H263 : vcodec->codec_id = CODEC_ID_FLV1 ; break; 62 case FLV_CODECID_H263 : vcodec->codec_id = CODEC_ID_FLV1 ; break;
71 case FLV_CODECID_SCREEN: vcodec->codec_id = CODEC_ID_FLASHSV; break; 63 case FLV_CODECID_SCREEN: vcodec->codec_id = CODEC_ID_FLASHSV; break;
72 case FLV_CODECID_VP6A :
73 if (!flv->alpha_stream) {
74 AVCodecContext *alpha_codec;
75 flv->alpha_stream = av_new_stream(s, 2);
76 if (flv->alpha_stream) {
77 av_set_pts_info(flv->alpha_stream, 24, 1, 1000);
78 alpha_codec = flv->alpha_stream->codec;
79 alpha_codec->codec_type = CODEC_TYPE_VIDEO;
80 alpha_codec->codec_id = CODEC_ID_VP6F;
81 alpha_codec->extradata_size = 1;
82 alpha_codec->extradata = av_malloc(1);
83 }
84 }
85 case FLV_CODECID_VP6 : vcodec->codec_id = CODEC_ID_VP6F ; 64 case FLV_CODECID_VP6 : vcodec->codec_id = CODEC_ID_VP6F ;
86 if(vcodec->extradata_size != 1) { 65 if(vcodec->extradata_size != 1) {
87 vcodec->extradata_size = 1; 66 vcodec->extradata_size = 1;
88 vcodec->extradata = av_malloc(1); 67 vcodec->extradata = av_malloc(1);
89 } 68 }
90 vcodec->extradata[0] = get_byte(&s->pb); 69 vcodec->extradata[0] = get_byte(&s->pb);
91 if (flv->alpha_stream)
92 flv->alpha_stream->codec->extradata[0] = vcodec->extradata[0];
93 return 1; // 1 byte body size adjustment for flv_read_packet() 70 return 1; // 1 byte body size adjustment for flv_read_packet()
94 default: 71 default:
95 av_log(s, AV_LOG_INFO, "Unsupported video codec (%x)\n", flv_codecid); 72 av_log(s, AV_LOG_INFO, "Unsupported video codec (%x)\n", flv_codecid);
96 vcodec->codec_tag = flv_codecid; 73 vcodec->codec_tag = flv_codecid;
97 } 74 }
280 return 0; 257 return 0;
281 } 258 }
282 259
283 static int flv_read_packet(AVFormatContext *s, AVPacket *pkt) 260 static int flv_read_packet(AVFormatContext *s, AVPacket *pkt)
284 { 261 {
285 int ret, i, type, size, flags, is_audio, next, pos; 262 int ret, i, type, size, pts, flags, is_audio, next, pos;
286 FLVContext *flv = s->priv_data;
287 AVStream *st = NULL; 263 AVStream *st = NULL;
288
289 if (flv->alpha_stream && flv->alpha_size) {
290 is_audio = 0;
291 size = flv->alpha_size;
292 flv->alpha_size = 0;
293 flags = flv->flags;
294 st = flv->alpha_stream;
295 goto packet;
296 }
297 264
298 for(;;){ 265 for(;;){
299 pos = url_ftell(&s->pb); 266 pos = url_ftell(&s->pb);
300 url_fskip(&s->pb, 4); /* size of previous packet */ 267 url_fskip(&s->pb, 4); /* size of previous packet */
301 type = get_byte(&s->pb); 268 type = get_byte(&s->pb);
302 size = get_be24(&s->pb); 269 size = get_be24(&s->pb);
303 flv->pts = get_be24(&s->pb); 270 pts = get_be24(&s->pb);
304 // av_log(s, AV_LOG_DEBUG, "type:%d, size:%d, pts:%d\n", type, size, flv->pts); 271 // av_log(s, AV_LOG_DEBUG, "type:%d, size:%d, pts:%d\n", type, size, pts);
305 if (url_feof(&s->pb)) 272 if (url_feof(&s->pb))
306 return AVERROR(EIO); 273 return AVERROR(EIO);
307 url_fskip(&s->pb, 4); /* reserved */ 274 url_fskip(&s->pb, 4); /* reserved */
308 flags = 0; 275 flags = 0;
309 276
345 ){ 312 ){
346 url_fseek(&s->pb, next, SEEK_SET); 313 url_fseek(&s->pb, next, SEEK_SET);
347 continue; 314 continue;
348 } 315 }
349 if ((flags & FLV_VIDEO_FRAMETYPE_MASK) == FLV_FRAME_KEY) 316 if ((flags & FLV_VIDEO_FRAMETYPE_MASK) == FLV_FRAME_KEY)
350 av_add_index_entry(st, pos, flv->pts, size, 0, AVINDEX_KEYFRAME); 317 av_add_index_entry(st, pos, pts, size, 0, AVINDEX_KEYFRAME);
351 break; 318 break;
352 } 319 }
353 320
354 // if not streamed and no duration from metadata then seek to end to find the duration from the timestamps 321 // if not streamed and no duration from metadata then seek to end to find the duration from the timestamps
355 if(!url_is_streamed(&s->pb) && s->duration==AV_NOPTS_VALUE){ 322 if(!url_is_streamed(&s->pb) && s->duration==AV_NOPTS_VALUE){
377 } 344 }
378 }else{ 345 }else{
379 size -= flv_set_video_codec(s, st, flags & FLV_VIDEO_CODECID_MASK); 346 size -= flv_set_video_codec(s, st, flags & FLV_VIDEO_CODECID_MASK);
380 } 347 }
381 348
382 if ((flags & FLV_VIDEO_CODECID_MASK) == FLV_CODECID_VP6A) {
383 int alpha_offset = get_be24(&s->pb);
384 if ((flags & FLV_VIDEO_FRAMETYPE_MASK) == FLV_FRAME_KEY)
385 av_add_index_entry(flv->alpha_stream, pos, flv->pts, size,
386 0, AVINDEX_KEYFRAME);
387 flv->alpha_size = size - 3 - alpha_offset;
388 size = alpha_offset + 1;
389 flv->flags = flags;
390 }
391 packet:
392 ret= av_get_packet(&s->pb, pkt, size - 1); 349 ret= av_get_packet(&s->pb, pkt, size - 1);
393 if (ret <= 0) { 350 if (ret <= 0) {
394 return AVERROR(EIO); 351 return AVERROR(EIO);
395 } 352 }
396 /* note: we need to modify the packet size here to handle the last 353 /* note: we need to modify the packet size here to handle the last
397 packet */ 354 packet */
398 pkt->size = ret; 355 pkt->size = ret;
399 pkt->pts = flv->pts; 356 pkt->pts = pts;
400 pkt->stream_index = st->index; 357 pkt->stream_index = st->index;
401 358
402 if (is_audio || ((flags & FLV_VIDEO_FRAMETYPE_MASK) == FLV_FRAME_KEY)) 359 if (is_audio || ((flags & FLV_VIDEO_FRAMETYPE_MASK) == FLV_FRAME_KEY))
403 pkt->flags |= PKT_FLAG_KEY; 360 pkt->flags |= PKT_FLAG_KEY;
404 361
422 } 379 }
423 380
424 AVInputFormat flv_demuxer = { 381 AVInputFormat flv_demuxer = {
425 "flv", 382 "flv",
426 "flv format", 383 "flv format",
427 sizeof(FLVContext), 384 0,
428 flv_probe, 385 flv_probe,
429 flv_read_header, 386 flv_read_header,
430 flv_read_packet, 387 flv_read_packet,
431 flv_read_close, 388 flv_read_close,
432 flv_read_seek, 389 flv_read_seek,