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 }