comparison flvdec.c @ 5916:1fec9e2cd5c5 libavformat

Fix flvdec start-of-frame. Patch by Howard Chu hyc highlandsun com
author benoit
date Thu, 01 Apr 2010 08:02:20 +0000
parents 11bb10c37225
children 0abde6943674
comparison
equal deleted inserted replaced
5915:4cc7fc1878b4 5916:1fec9e2cd5c5
268 return AVERROR(ENOMEM); 268 return AVERROR(ENOMEM);
269 } 269 }
270 270
271 offset = get_be32(s->pb); 271 offset = get_be32(s->pb);
272 url_fseek(s->pb, offset, SEEK_SET); 272 url_fseek(s->pb, offset, SEEK_SET);
273 url_fskip(s->pb, 4);
273 274
274 s->start_time = 0; 275 s->start_time = 0;
275 276
276 return 0; 277 return 0;
277 } 278 }
293 int ret, i, type, size, flags, is_audio; 294 int ret, i, type, size, flags, is_audio;
294 int64_t next, pos; 295 int64_t next, pos;
295 int64_t dts, pts = AV_NOPTS_VALUE; 296 int64_t dts, pts = AV_NOPTS_VALUE;
296 AVStream *st = NULL; 297 AVStream *st = NULL;
297 298
298 for(;;){ 299 for(;;url_fskip(s->pb, 4)){ /* pkt size is repeated at end. skip it */
299 pos = url_ftell(s->pb); 300 pos = url_ftell(s->pb);
300 url_fskip(s->pb, 4); /* size of previous packet */
301 type = get_byte(s->pb); 301 type = get_byte(s->pb);
302 size = get_be24(s->pb); 302 size = get_be24(s->pb);
303 dts = get_be24(s->pb); 303 dts = get_be24(s->pb);
304 dts |= get_byte(s->pb) << 24; 304 dts |= get_byte(s->pb) << 24;
305 // av_log(s, AV_LOG_DEBUG, "type:%d, size:%d, dts:%d\n", type, size, dts); 305 // av_log(s, AV_LOG_DEBUG, "type:%d, size:%d, dts:%d\n", type, size, dts);
415 st->codec->sample_rate = cfg.sample_rate; 415 st->codec->sample_rate = cfg.sample_rate;
416 dprintf(s, "mp4a config channels %d sample rate %d\n", 416 dprintf(s, "mp4a config channels %d sample rate %d\n",
417 st->codec->channels, st->codec->sample_rate); 417 st->codec->channels, st->codec->sample_rate);
418 } 418 }
419 419
420 return AVERROR(EAGAIN); 420 ret = AVERROR(EAGAIN);
421 goto leave;
421 } 422 }
422 } 423 }
423 424
424 /* skip empty data packets */ 425 /* skip empty data packets */
425 if (!size) 426 if (!size) {
426 return AVERROR(EAGAIN); 427 ret = AVERROR(EAGAIN);
428 goto leave;
429 }
427 430
428 ret= av_get_packet(s->pb, pkt, size); 431 ret= av_get_packet(s->pb, pkt, size);
429 if (ret < 0) { 432 if (ret < 0) {
430 return AVERROR(EIO); 433 return AVERROR(EIO);
431 } 434 }
437 pkt->stream_index = st->index; 440 pkt->stream_index = st->index;
438 441
439 if (is_audio || ((flags & FLV_VIDEO_FRAMETYPE_MASK) == FLV_FRAME_KEY)) 442 if (is_audio || ((flags & FLV_VIDEO_FRAMETYPE_MASK) == FLV_FRAME_KEY))
440 pkt->flags |= AV_PKT_FLAG_KEY; 443 pkt->flags |= AV_PKT_FLAG_KEY;
441 444
445 leave:
446 url_fskip(s->pb, 4);
442 return ret; 447 return ret;
443 } 448 }
444 449
445 AVInputFormat flv_demuxer = { 450 AVInputFormat flv_demuxer = {
446 "flv", 451 "flv",