@@ -784,7 +784,7 @@ static stream_t *allocate_stream_context(av_t *av, int index, AVCodec *codec) {
784
784
return stream ;
785
785
}
786
786
787
- static stream_t * open_stream_index (av_t * av , int index ) {
787
+ static stream_t * open_stream_index (av_t * av , int index , AVCodec * dec ) {
788
788
int err ;
789
789
790
790
if (!av -> format_context )
@@ -798,10 +798,11 @@ static stream_t *open_stream_index(av_t *av, int index) {
798
798
799
799
// find decoder for the stream
800
800
AVCodecParameters * dec_param = av -> format_context -> streams [index ]-> codecpar ;
801
-
802
- caml_release_runtime_system ();
803
- AVCodec * dec = avcodec_find_decoder (dec_param -> codec_id );
804
- caml_acquire_runtime_system ();
801
+ if (!dec ) {
802
+ caml_release_runtime_system ();
803
+ dec = avcodec_find_decoder (dec_param -> codec_id );
804
+ caml_acquire_runtime_system ();
805
+ }
805
806
806
807
if (!dec )
807
808
ocaml_avutil_raise_error (AVERROR_DECODER_NOT_FOUND );
@@ -829,12 +830,6 @@ static stream_t *open_stream_index(av_t *av, int index) {
829
830
return stream ;
830
831
}
831
832
832
- #define Check_stream (av , index ) \
833
- { \
834
- if (!(av)->streams || !(av)->streams[(index)]) \
835
- open_stream_index((av), (index)); \
836
- }
837
-
838
833
CAMLprim value ocaml_av_find_best_stream (value _av , value _media_type ) {
839
834
CAMLparam2 (_av , _media_type );
840
835
av_t * av = Av_val (_av );
@@ -924,6 +919,8 @@ CAMLprim value ocaml_av_read_input(value _packet, value _frame, value _av) {
924
919
av_t * av = Av_val (_av );
925
920
AVFrame * frame ;
926
921
int i , ret , frame_kind , skip ;
922
+ value _dec ;
923
+ AVCodec * dec = NULL ;
927
924
928
925
if (!av -> streams && !allocate_input_context (av ))
929
926
caml_raise_out_of_memory ();
@@ -948,21 +945,29 @@ CAMLprim value ocaml_av_read_input(value _packet, value _frame, value _av) {
948
945
949
946
skip = 1 ;
950
947
for (i = 0 ; i < Wosize_val (_packet ); i ++ )
951
- if (Int_val (Field (_packet , i )) == packet -> stream_index )
948
+ if (Int_val (Field (Field (_packet , i ), 0 )) == packet -> stream_index ) {
949
+ _dec = Field (Field (_packet , i ), 1 );
952
950
skip = 0 ;
951
+ }
953
952
954
953
for (i = 0 ; i < Wosize_val (_frame ); i ++ )
955
- if (Int_val (Field (_frame , i )) == packet -> stream_index )
954
+ if (Int_val (Field (Field (_frame , i ), 0 )) == packet -> stream_index ) {
955
+ _dec = Field (Field (_frame , i ), 1 );
956
956
skip = 0 ;
957
+ }
957
958
958
959
if (skip )
959
960
continue ;
960
961
962
+ if (_dec != Val_none ) {
963
+ dec = (AVCodec * )Some_val (_dec );
964
+ }
965
+
961
966
if ((stream = streams [packet -> stream_index ]) == NULL )
962
- stream = open_stream_index (av , packet -> stream_index );
967
+ stream = open_stream_index (av , packet -> stream_index , dec );
963
968
964
969
for (i = 0 ; i < Wosize_val (_packet ); i ++ ) {
965
- if (Int_val (Field (_packet , i )) == packet -> stream_index ) {
970
+ if (Int_val (Field (Field ( _packet , i ), 0 )) == packet -> stream_index ) {
966
971
decoded_content = caml_alloc_tuple (2 );
967
972
Field (decoded_content , 0 ) = Val_int (packet -> stream_index );
968
973
Field (decoded_content , 1 ) = value_of_ffmpeg_packet (packet );
@@ -999,7 +1004,7 @@ CAMLprim value ocaml_av_read_input(value _packet, value _frame, value _av) {
999
1004
1000
1005
skip = 1 ;
1001
1006
for (i = 0 ; i < Wosize_val (_frame ); i ++ ) {
1002
- if (Int_val (Field (_frame , i )) == stream -> index ) {
1007
+ if (Int_val (Field (Field ( _frame , i ), 0 )) == stream -> index ) {
1003
1008
skip = 0 ;
1004
1009
}
1005
1010
}
0 commit comments