@@ -729,8 +729,6 @@ AVRational av_guess_frame_rate(AVFormatContext *format, AVStream *st, AVFrame *f
729
729
{
730
730
AVRational fr = st -> r_frame_rate ;
731
731
const AVCodecDescriptor * desc = cffstream (st )-> codec_desc ;
732
- AVCodecContext * const avctx = ffstream (st )-> avctx ;
733
- AVRational codec_fr = avctx -> framerate ;
734
732
AVRational avg_fr = st -> avg_frame_rate ;
735
733
736
734
if (avg_fr .num > 0 && avg_fr .den > 0 && fr .num > 0 && fr .den > 0 &&
@@ -739,6 +737,9 @@ AVRational av_guess_frame_rate(AVFormatContext *format, AVStream *st, AVFrame *f
739
737
}
740
738
741
739
if (desc && (desc -> props & AV_CODEC_PROP_FIELDS )) {
740
+ const AVCodecContext * const avctx = ffstream (st )-> avctx ;
741
+ AVRational codec_fr = avctx -> framerate ;
742
+
742
743
if ( codec_fr .num > 0 && codec_fr .den > 0 &&
743
744
(fr .num == 0 || av_q2d (codec_fr ) < av_q2d (fr )* 0.7 && fabs (1.0 - av_q2d (av_div_q (avg_fr , fr ))) > 0.1 ))
744
745
fr = codec_fr ;
@@ -753,13 +754,19 @@ int avformat_transfer_internal_stream_timing_info(const AVOutputFormat *ofmt,
753
754
{
754
755
const AVCodecDescriptor * desc = cffstream (ist )-> codec_desc ;
755
756
const AVCodecContext * const dec_ctx = cffstream (ist )-> avctx ;
756
- AVCodecContext * const enc_ctx = ffstream (ost )-> avctx ;
757
757
758
758
AVRational mul = (AVRational ){ desc && (desc -> props & AV_CODEC_PROP_FIELDS ) ? 2 : 1 , 1 };
759
- AVRational dec_ctx_tb = dec_ctx -> framerate .num ? av_inv_q (av_mul_q (dec_ctx -> framerate , mul ))
759
+ AVRational dec_ctx_framerate = dec_ctx ? dec_ctx -> framerate : (AVRational ){ 0 , 0 };
760
+ AVRational dec_ctx_tb = dec_ctx_framerate .num ? av_inv_q (av_mul_q (dec_ctx_framerate , mul ))
760
761
: (ist -> codecpar -> codec_type == AVMEDIA_TYPE_AUDIO ? (AVRational ){0 , 1 }
761
762
: ist -> time_base );
762
- enc_ctx -> time_base = ist -> time_base ;
763
+ AVRational enc_tb = ist -> time_base ;
764
+ #if FF_API_TICKS_PER_FRAME
765
+ FF_DISABLE_DEPRECATION_WARNINGS
766
+ int ticks_per_frame = dec_ctx ? dec_ctx -> ticks_per_frame : 1 ;
767
+ FF_ENABLE_DEPRECATION_WARNINGS
768
+ #endif
769
+
763
770
/*
764
771
* Avi is a special case here because it supports variable fps but
765
772
* having the fps and timebase differe significantly adds quite some
@@ -773,35 +780,31 @@ int avformat_transfer_internal_stream_timing_info(const AVOutputFormat *ofmt,
773
780
&& 0.5 /av_q2d (ist -> r_frame_rate ) > av_q2d (dec_ctx_tb )
774
781
&& av_q2d (ist -> time_base ) < 1.0 /500 && av_q2d (dec_ctx_tb ) < 1.0 /500
775
782
|| copy_tb == AVFMT_TBCF_R_FRAMERATE ) {
776
- enc_ctx -> time_base .num = ist -> r_frame_rate .den ;
777
- enc_ctx -> time_base .den = 2 * ist -> r_frame_rate .num ;
783
+ enc_tb .num = ist -> r_frame_rate .den ;
784
+ enc_tb .den = 2 * ist -> r_frame_rate .num ;
778
785
} else
779
786
#endif
780
- if (copy_tb == AVFMT_TBCF_AUTO && dec_ctx -> framerate .num &&
781
- av_q2d (av_inv_q (dec_ctx -> framerate )) > 2 * av_q2d (ist -> time_base )
787
+ if (copy_tb == AVFMT_TBCF_AUTO && dec_ctx_framerate .num &&
788
+ av_q2d (av_inv_q (dec_ctx_framerate )) > 2 * av_q2d (ist -> time_base )
782
789
&& av_q2d (ist -> time_base ) < 1.0 /500
783
790
|| (copy_tb == AVFMT_TBCF_DECODER &&
784
- (dec_ctx -> framerate .num || ist -> codecpar -> codec_type == AVMEDIA_TYPE_AUDIO ))) {
785
- enc_ctx -> time_base = dec_ctx_tb ;
786
- enc_ctx -> time_base .den *= 2 ;
791
+ (dec_ctx_framerate .num || ist -> codecpar -> codec_type == AVMEDIA_TYPE_AUDIO ))) {
792
+ enc_tb = dec_ctx_tb ;
793
+ enc_tb .den *= 2 ;
787
794
#if FF_API_TICKS_PER_FRAME
788
- FF_DISABLE_DEPRECATION_WARNINGS
789
- enc_ctx -> time_base .num *= dec_ctx -> ticks_per_frame ;
790
- FF_ENABLE_DEPRECATION_WARNINGS
795
+ enc_tb .num *= ticks_per_frame ;
791
796
#endif
792
797
}
793
798
} else if (!(ofmt -> flags & AVFMT_VARIABLE_FPS )
794
799
&& !av_match_name (ofmt -> name , "mov,mp4,3gp,3g2,psp,ipod,ismv,f4v" )) {
795
- if (copy_tb == AVFMT_TBCF_AUTO && dec_ctx -> framerate .num
796
- && av_q2d (av_inv_q (dec_ctx -> framerate )) > av_q2d (ist -> time_base )
800
+ if (copy_tb == AVFMT_TBCF_AUTO && dec_ctx_framerate .num
801
+ && av_q2d (av_inv_q (dec_ctx_framerate )) > av_q2d (ist -> time_base )
797
802
&& av_q2d (ist -> time_base ) < 1.0 /500
798
803
|| (copy_tb == AVFMT_TBCF_DECODER &&
799
- (dec_ctx -> framerate .num || ist -> codecpar -> codec_type == AVMEDIA_TYPE_AUDIO ))) {
800
- enc_ctx -> time_base = dec_ctx_tb ;
804
+ (dec_ctx_framerate .num || ist -> codecpar -> codec_type == AVMEDIA_TYPE_AUDIO ))) {
805
+ enc_tb = dec_ctx_tb ;
801
806
#if FF_API_TICKS_PER_FRAME
802
- FF_DISABLE_DEPRECATION_WARNINGS
803
- enc_ctx -> time_base .num *= dec_ctx -> ticks_per_frame ;
804
- FF_ENABLE_DEPRECATION_WARNINGS
807
+ enc_tb .num *= ticks_per_frame ;
805
808
#endif
806
809
}
807
810
}
@@ -810,18 +813,19 @@ FF_ENABLE_DEPRECATION_WARNINGS
810
813
&& dec_ctx_tb .num < dec_ctx_tb .den
811
814
&& dec_ctx_tb .num > 0
812
815
&& 121LL * dec_ctx_tb .num > dec_ctx_tb .den ) {
813
- enc_ctx -> time_base = dec_ctx_tb ;
816
+ enc_tb = dec_ctx_tb ;
814
817
}
815
818
816
- av_reduce (& enc_ctx -> time_base .num , & enc_ctx -> time_base .den ,
817
- enc_ctx -> time_base .num , enc_ctx -> time_base .den , INT_MAX );
819
+ av_reduce (& ffstream (ost )-> transferred_mux_tb .num ,
820
+ & ffstream (ost )-> transferred_mux_tb .den ,
821
+ enc_tb .num , enc_tb .den , INT_MAX );
818
822
819
823
return 0 ;
820
824
}
821
825
822
826
AVRational av_stream_get_codec_timebase (const AVStream * st )
823
827
{
824
- return cffstream (st )-> avctx -> time_base ;
828
+ return cffstream (st )-> avctx ? cffstream ( st ) -> avctx -> time_base : cffstream ( st ) -> transferred_mux_tb ;
825
829
}
826
830
827
831
void avpriv_set_pts_info (AVStream * st , int pts_wrap_bits ,
@@ -846,7 +850,8 @@ void avpriv_set_pts_info(AVStream *st, int pts_wrap_bits,
846
850
return ;
847
851
}
848
852
st -> time_base = new_tb ;
849
- sti -> avctx -> pkt_timebase = new_tb ;
853
+ if (sti -> avctx )
854
+ sti -> avctx -> pkt_timebase = new_tb ;
850
855
st -> pts_wrap_bits = pts_wrap_bits ;
851
856
}
852
857
0 commit comments