@@ -22,7 +22,6 @@ AvInputVideo::AvInputVideo( AvInputStream& inputStream )
22
22
, _inputStream ( &inputStream )
23
23
, _codec( eCodecTypeDecoder, inputStream.getVideoCodec().getCodecId() )
24
24
, _frame ( NULL )
25
- , _selectedStream( -1 )
26
25
{
27
26
}
28
27
@@ -82,27 +81,30 @@ bool AvInputVideo::readNextFrame( Frame& frameBuffer )
82
81
while ( ! got_frame )
83
82
{
84
83
CodedData data;
85
- if ( ! _inputStream->readNextPacket ( data ) )
86
- return false ;
87
84
88
85
AVPacket packet;
89
86
av_init_packet ( &packet );
90
87
91
- packet.stream_index = _selectedStream;
92
- packet.data = data.getPtr ();
93
- packet.size = data.getSize ();
94
-
88
+ bool nextPacketRead = _inputStream->readNextPacket ( data );
89
+
90
+ packet.stream_index = _inputStream->getStreamIndex ();
91
+ packet.data = nextPacketRead ? data.getPtr (): NULL ;
92
+ packet.size = data.getSize ();
93
+
95
94
int ret = avcodec_decode_video2 ( _codec.getAVCodecContext (), _frame, &got_frame, &packet );
96
95
96
+ av_free_packet ( &packet );
97
+
98
+ if ( ! nextPacketRead && ret == 0 && got_frame == 0 )
99
+ return false ;
100
+
97
101
if ( ret < 0 )
98
102
{
99
103
char err[250 ];
100
104
av_strerror ( ret, err, 250 );
101
105
102
106
throw std::runtime_error ( " an error occured during video decoding - " + std::string (err) );
103
107
}
104
-
105
- av_free_packet ( &packet );
106
108
}
107
109
108
110
VideoFrame& imageBuffer = static_cast <VideoFrame&>( frameBuffer );
0 commit comments