Mercurial > libavformat.hg
comparison swf.c @ 1889:e81bae269ae1 libavformat
fix pts handling
author | bcoudurier |
---|---|
date | Thu, 08 Mar 2007 21:29:38 +0000 |
parents | 58f48e9350af |
children | 04f9a3ae30af |
comparison
equal
deleted
inserted
replaced
1888:f794ef55fafe | 1889:e81bae269ae1 |
---|---|
65 | 65 |
66 int samples_per_frame; | 66 int samples_per_frame; |
67 int sound_samples; | 67 int sound_samples; |
68 int swf_frame_number; | 68 int swf_frame_number; |
69 int video_frame_number; | 69 int video_frame_number; |
70 int ms_per_frame; | 70 int frame_rate; |
71 int tag; | 71 int tag; |
72 | 72 |
73 uint8_t audio_fifo[AUDIO_FIFO_SIZE]; | 73 uint8_t audio_fifo[AUDIO_FIFO_SIZE]; |
74 int audio_in_pos; | 74 int audio_in_pos; |
75 | 75 |
629 | 629 |
630 static int swf_read_header(AVFormatContext *s, AVFormatParameters *ap) | 630 static int swf_read_header(AVFormatContext *s, AVFormatParameters *ap) |
631 { | 631 { |
632 SWFContext *swf = s->priv_data; | 632 SWFContext *swf = s->priv_data; |
633 ByteIOContext *pb = &s->pb; | 633 ByteIOContext *pb = &s->pb; |
634 int nbits, len, frame_rate, tag, v; | 634 int nbits, len, tag, v; |
635 offset_t frame_offset = -1; | 635 offset_t frame_offset = -1; |
636 AVStream *ast = 0; | 636 AVStream *ast = 0; |
637 AVStream *vst = 0; | 637 AVStream *vst = 0; |
638 | 638 |
639 tag = get_be32(pb) & 0xffffff00; | 639 tag = get_be32(pb) & 0xffffff00; |
648 get_le32(pb); | 648 get_le32(pb); |
649 /* skip rectangle size */ | 649 /* skip rectangle size */ |
650 nbits = get_byte(pb) >> 3; | 650 nbits = get_byte(pb) >> 3; |
651 len = (4 * nbits - 3 + 7) / 8; | 651 len = (4 * nbits - 3 + 7) / 8; |
652 url_fskip(pb, len); | 652 url_fskip(pb, len); |
653 frame_rate = get_le16(pb); | 653 swf->frame_rate = get_le16(pb); /* 8.8 fixed */ |
654 get_le16(pb); /* frame count */ | 654 get_le16(pb); /* frame count */ |
655 | 655 |
656 /* The Flash Player converts 8.8 frame rates | |
657 to milliseconds internally. Do the same to get | |
658 a correct framerate */ | |
659 swf->ms_per_frame = ( 1000 * 256 ) / frame_rate; | |
660 swf->samples_per_frame = 0; | 656 swf->samples_per_frame = 0; |
661 | 657 |
662 for(;;) { | 658 for(;;) { |
663 offset_t tag_offset = url_ftell(pb); | 659 offset_t tag_offset = url_ftell(pb); |
664 tag = get_swf_tag(pb, &len); | 660 tag = get_swf_tag(pb, &len); |
681 int sample_rate_code; | 677 int sample_rate_code; |
682 get_byte(pb); | 678 get_byte(pb); |
683 v = get_byte(pb); | 679 v = get_byte(pb); |
684 swf->samples_per_frame = get_le16(pb); | 680 swf->samples_per_frame = get_le16(pb); |
685 ast = av_new_stream(s, -1); /* -1 to avoid clash with video stream ch_id */ | 681 ast = av_new_stream(s, -1); /* -1 to avoid clash with video stream ch_id */ |
686 av_set_pts_info(ast, 24, 1, 1000); /* 24 bit pts in ms */ | 682 av_set_pts_info(ast, 64, 256, swf->frame_rate); /* XXX same as video stream */ |
687 swf->audio_stream_index = ast->index; | 683 swf->audio_stream_index = ast->index; |
688 ast->codec->channels = 1 + (v&1); | 684 ast->codec->channels = 1 + (v&1); |
689 ast->codec->codec_type = CODEC_TYPE_AUDIO; | 685 ast->codec->codec_type = CODEC_TYPE_AUDIO; |
690 ast->codec->codec_id = codec_get_id(swf_audio_codec_tags, (v>>4) & 15); | 686 ast->codec->codec_id = codec_get_id(swf_audio_codec_tags, (v>>4) & 15); |
691 ast->need_parsing = 1; | 687 ast->need_parsing = 1; |
704 frame_offset = tag_offset; | 700 frame_offset = tag_offset; |
705 } else { | 701 } else { |
706 url_fskip(pb, len); | 702 url_fskip(pb, len); |
707 } | 703 } |
708 } | 704 } |
709 if (vst) { | 705 if (vst) |
710 av_set_pts_info(vst, 24, 1, 1000); /* 24 bit pts in ms */ | 706 av_set_pts_info(vst, 64, 256, swf->frame_rate); |
711 if (swf->ms_per_frame) { | |
712 vst->codec->time_base.den = 1000. / swf->ms_per_frame; | |
713 vst->codec->time_base.num = 1; | |
714 } | |
715 } | |
716 return 0; | 707 return 0; |
717 } | 708 } |
718 | 709 |
719 static int swf_read_packet(AVFormatContext *s, AVPacket *pkt) | 710 static int swf_read_packet(AVFormatContext *s, AVPacket *pkt) |
720 { | 711 { |
733 for( i=0; i<s->nb_streams; i++ ) { | 724 for( i=0; i<s->nb_streams; i++ ) { |
734 st = s->streams[i]; | 725 st = s->streams[i]; |
735 if (st->codec->codec_type == CODEC_TYPE_VIDEO && st->id == ch_id) { | 726 if (st->codec->codec_type == CODEC_TYPE_VIDEO && st->id == ch_id) { |
736 frame = get_le16(pb); | 727 frame = get_le16(pb); |
737 av_get_packet(pb, pkt, len-2); | 728 av_get_packet(pb, pkt, len-2); |
738 pkt->pts = frame * swf->ms_per_frame; | 729 pkt->pts = frame; |
739 pkt->stream_index = st->index; | 730 pkt->stream_index = st->index; |
740 return pkt->size; | 731 return pkt->size; |
741 } | 732 } |
742 } | 733 } |
743 } else if (tag == TAG_STREAMBLOCK) { | 734 } else if (tag == TAG_STREAMBLOCK) { |