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