Mercurial > libavformat.hg
comparison ffmdec.c @ 3442:a6f4d53b738d libavformat
pass dts and pts through ffm, should fix streaming b frames
author | bcoudurier |
---|---|
date | Mon, 09 Jun 2008 07:43:14 +0000 |
parents | 2d52ccde8f86 |
children | 59989e1a2154 |
comparison
equal
deleted
inserted
replaced
3441:2d52ccde8f86 | 3442:a6f4d53b738d |
---|---|
98 url_fseek(pb, ffm->packet_size, SEEK_SET); | 98 url_fseek(pb, ffm->packet_size, SEEK_SET); |
99 retry_read: | 99 retry_read: |
100 get_be16(pb); /* PACKET_ID */ | 100 get_be16(pb); /* PACKET_ID */ |
101 fill_size = get_be16(pb); | 101 fill_size = get_be16(pb); |
102 ffm->pts = get_be64(pb); | 102 ffm->pts = get_be64(pb); |
103 ffm->first_frame_in_packet = 1; | |
104 frame_offset = get_be16(pb); | 103 frame_offset = get_be16(pb); |
105 get_buffer(pb, ffm->packet, ffm->packet_size - FFM_HEADER_SIZE); | 104 get_buffer(pb, ffm->packet, ffm->packet_size - FFM_HEADER_SIZE); |
106 ffm->packet_end = ffm->packet + (ffm->packet_size - FFM_HEADER_SIZE - fill_size); | 105 ffm->packet_end = ffm->packet + (ffm->packet_size - FFM_HEADER_SIZE - fill_size); |
107 if (ffm->packet_end < ffm->packet || frame_offset < 0) | 106 if (ffm->packet_end < ffm->packet || frame_offset < 0) |
108 return -1; | 107 return -1; |
359 FFMContext *ffm = s->priv_data; | 358 FFMContext *ffm = s->priv_data; |
360 int duration; | 359 int duration; |
361 | 360 |
362 switch(ffm->read_state) { | 361 switch(ffm->read_state) { |
363 case READ_HEADER: | 362 case READ_HEADER: |
364 if (!ffm_is_avail_data(s, FRAME_HEADER_SIZE)) { | 363 if (!ffm_is_avail_data(s, FRAME_HEADER_SIZE+4)) { |
365 return AVERROR(EAGAIN); | 364 return AVERROR(EAGAIN); |
366 } | 365 } |
367 dprintf(s, "pos=%08"PRIx64" spos=%"PRIx64", write_index=%"PRIx64" size=%"PRIx64"\n", | 366 dprintf(s, "pos=%08"PRIx64" spos=%"PRIx64", write_index=%"PRIx64" size=%"PRIx64"\n", |
368 url_ftell(s->pb), s->pb.pos, ffm->write_index, ffm->file_size); | 367 url_ftell(s->pb), s->pb.pos, ffm->write_index, ffm->file_size); |
369 if (ffm_read_data(s, ffm->header, FRAME_HEADER_SIZE, 1) != | 368 if (ffm_read_data(s, ffm->header, FRAME_HEADER_SIZE, 1) != |
370 FRAME_HEADER_SIZE) | 369 FRAME_HEADER_SIZE) |
371 return AVERROR(EAGAIN); | 370 return AVERROR(EAGAIN); |
371 if (ffm->header[1] & FLAG_DTS) | |
372 if (ffm_read_data(s, ffm->header+16, 4, 1) != 4) | |
373 return AVERROR(EAGAIN); | |
372 #if 0 | 374 #if 0 |
373 av_hexdump_log(s, AV_LOG_DEBUG, ffm->header, FRAME_HEADER_SIZE); | 375 av_hexdump_log(s, AV_LOG_DEBUG, ffm->header, FRAME_HEADER_SIZE); |
374 #endif | 376 #endif |
375 ffm->read_state = READ_DATA; | 377 ffm->read_state = READ_DATA; |
376 /* fall thru */ | 378 /* fall thru */ |
398 if (ffm_read_data(s, pkt->data, size, 0) != size) { | 400 if (ffm_read_data(s, pkt->data, size, 0) != size) { |
399 /* bad case: desynchronized packet. we cancel all the packet loading */ | 401 /* bad case: desynchronized packet. we cancel all the packet loading */ |
400 av_free_packet(pkt); | 402 av_free_packet(pkt); |
401 return AVERROR(EAGAIN); | 403 return AVERROR(EAGAIN); |
402 } | 404 } |
403 if (ffm->first_frame_in_packet) | 405 pkt->pts = AV_RB64(ffm->header+8); |
404 { | 406 if (ffm->header[1] & FLAG_DTS) |
405 pkt->pts = ffm->pts; | 407 pkt->dts = pkt->pts - AV_RB32(ffm->header+16); |
406 ffm->first_frame_in_packet = 0; | 408 else |
407 } | 409 pkt->dts = pkt->pts; |
408 pkt->duration = duration; | 410 pkt->duration = duration; |
409 break; | 411 break; |
410 } | 412 } |
411 return 0; | 413 return 0; |
412 } | 414 } |