\r
if(packet->data == nullptr)\r
{ \r
- packets_.pop();\r
if(codec_context_->codec->capabilities & CODEC_CAP_DELAY)\r
{\r
- auto video = decode(packet.get());\r
+ auto video = decode(packet);\r
if(video)\r
return video;\r
}\r
\r
- //packets_.pop();\r
+ packets_.pop();\r
file_frame_number_ = static_cast<size_t>(packet->pos);\r
avcodec_flush_buffers(codec_context_.get());\r
return flush_video(); \r
}\r
\r
packets_.pop();\r
- return decode(packet.get());\r
+ return decode(packet);\r
}\r
\r
- std::shared_ptr<AVFrame> decode(AVPacket* pkt)\r
+ std::shared_ptr<AVFrame> decode(safe_ptr<AVPacket> pkt)\r
{\r
std::shared_ptr<AVFrame> decoded_frame(avcodec_alloc_frame(), av_free);\r
\r
int frame_finished = 0;\r
- THROW_ON_ERROR2(avcodec_decode_video2(codec_context_.get(), decoded_frame.get(), &frame_finished, pkt), "[video_decocer]");\r
+ THROW_ON_ERROR2(avcodec_decode_video2(codec_context_.get(), decoded_frame.get(), &frame_finished, pkt.get()), "[video_decoder]");\r
\r
// If a decoder consumes less then the whole packet then something is wrong\r
// that might be just harmless padding at the end, or a problem with the\r
\r
++file_frame_number_;\r
\r
- //return decoded_frame;\r
+ // This ties the life of the decoded_frame to the packet that it came from. For the\r
+ // current version of ffmpeg (0.8 or c17808c) the RAW_VIDEO codec returns frame data\r
+ // owned by the packet.\r
return std::shared_ptr<AVFrame>(decoded_frame.get(), [decoded_frame, pkt](AVFrame*){});\r
}\r
\r