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) {