o FFmpeg producer:\r
+ Increased the max number of frames that audio/video can be badly\r
interleaved with (Dimitry Ishenko).\r
+ + Fixed bug where decoders sometimes requires more than one video packet to\r
+ decode the first frame.\r
o Framerate producer:\r
+ Fixed bug when INFO was used on a not yet playing framerate producer.\r
\r
tbb::parallel_invoke(
[&]
{
- if (!muxer_->video_ready() && video_decoder_)
- video = video_decoder_->poll();
+ do
+ {
+ if (!muxer_->video_ready() && video_decoder_)
+ {
+ video = video_decoder_->poll();
+ if (video)
+ break;
+ }
+ else
+ break;
+ } while (!video_decoder_->empty());
},
[&]
{
file_frame_number = std::max(file_frame_number, video_decoder_ ? video_decoder_->file_frame_number() : 0);
for (auto frame = muxer_->poll(); frame != core::draw_frame::empty(); frame = muxer_->poll())
- frame_buffer_.push(std::make_pair(frame, file_frame_number));
+ if (frame != core::draw_frame::empty())
+ frame_buffer_.push(std::make_pair(frame, file_frame_number));
}
bool audio_only() const
return packets_.size() >= 8;
}
+ bool empty() const
+ {
+ return packets_.empty();
+ }
+
uint32_t nb_frames() const
{
return std::max(nb_frames_, static_cast<uint32_t>(file_frame_number_));
void video_decoder::push(const std::shared_ptr<AVPacket>& packet){impl_->push(packet);}
std::shared_ptr<AVFrame> video_decoder::poll(){return impl_->poll();}
bool video_decoder::ready() const{return impl_->ready();}
+bool video_decoder::empty() const { return impl_->empty(); }
int video_decoder::width() const{return impl_->width_;}
int video_decoder::height() const{return impl_->height_;}
uint32_t video_decoder::nb_frames() const{return impl_->nb_frames();}
{
public:
explicit video_decoder(const spl::shared_ptr<AVFormatContext>& context);
-
+
bool ready() const;
+ bool empty() const;
void push(const std::shared_ptr<AVPacket>& packet);
std::shared_ptr<AVFrame> poll();
-
+
int width() const;
int height() const;
spl::shared_ptr<implementation> impl_;
};
-}}
\ No newline at end of file
+}}