@@ -77,12 +77,36 @@ void AvInputVideo::setup()
77
77
78
78
bool AvInputVideo::readNextFrame ( Frame& frameBuffer )
79
79
{
80
- int got_frame = 0 ;
80
+ if ( ! decodeNextFrame () )
81
+ return false ;
82
+
83
+ VideoFrame& imageBuffer = static_cast <VideoFrame&>( frameBuffer );
84
+
85
+ size_t decodedSize = avpicture_get_size ( (AVPixelFormat)_frame->format , _frame->width , _frame->height );
86
+ if ( ! decodedSize )
87
+ return false ;
88
+
89
+ if ( imageBuffer.getBuffer ().size () != decodedSize )
90
+ imageBuffer.getBuffer ().resize ( decodedSize );
91
+
92
+ // Copy pixel data from an AVPicture into one contiguous buffer.
93
+ avpicture_layout ( (AVPicture*)_frame, (AVPixelFormat)_frame->format , _frame->width , _frame->height , &imageBuffer.getBuffer ()[0 ], frameBuffer.getBuffer ().size () );
94
+
95
+ return true ;
96
+ }
97
+
98
+ bool AvInputVideo::readNextFrame ( Frame& frameBuffer, const size_t subStreamIndex )
99
+ {
100
+ return false ;
101
+ }
81
102
103
+ bool AvInputVideo::decodeNextFrame ()
104
+ {
105
+ int got_frame = 0 ;
82
106
while ( ! got_frame )
83
107
{
84
108
CodedData data;
85
- if ( ! _inputStream->readNextPacket ( data ) )
109
+ if ( ! _inputStream->readNextPacket ( data ) ) // error or end of file
86
110
return false ;
87
111
88
112
AVPacket packet;
@@ -104,27 +128,9 @@ bool AvInputVideo::readNextFrame( Frame& frameBuffer )
104
128
105
129
av_free_packet ( &packet );
106
130
}
107
-
108
- VideoFrame& imageBuffer = static_cast <VideoFrame&>( frameBuffer );
109
-
110
- size_t decodedSize = avpicture_get_size ( (AVPixelFormat)_frame->format , _frame->width , _frame->height );
111
- if ( ! decodedSize )
112
- return false ;
113
-
114
- if ( imageBuffer.getBuffer ().size () != decodedSize )
115
- imageBuffer.getBuffer ().resize ( decodedSize );
116
-
117
- // Copy pixel data from an AVPicture into one contiguous buffer.
118
- avpicture_layout ( (AVPicture*)_frame, (AVPixelFormat)_frame->format , _frame->width , _frame->height , &imageBuffer.getBuffer ()[0 ], frameBuffer.getBuffer ().size () );
119
-
120
131
return true ;
121
132
}
122
133
123
- bool AvInputVideo::readNextFrame ( Frame& frameBuffer, const size_t subStreamIndex )
124
- {
125
- return false ;
126
- }
127
-
128
134
void AvInputVideo::flushDecoder ()
129
135
{
130
136
avcodec_flush_buffers ( _codec->getAVCodecContext () );
0 commit comments