Mercurial > libavformat.hg
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", |