]> git.sesse.net Git - casparcg/blob - core/producer/ffmpeg/video/video_decoder.cpp
2.0.0.2:
[casparcg] / core / producer / ffmpeg / video / video_decoder.cpp
1 #include "../../../stdafx.h"\r
2 \r
3 #include "video_decoder.h"\r
4                 \r
5 #if defined(_MSC_VER)\r
6 #pragma warning (push)\r
7 #pragma warning (disable : 4244)\r
8 #endif\r
9 extern "C" \r
10 {\r
11         #define __STDC_CONSTANT_MACROS\r
12         #define __STDC_LIMIT_MACROS\r
13         #include <libavformat/avformat.h>\r
14 }\r
15 #if defined(_MSC_VER)\r
16 #pragma warning (pop)\r
17 #endif\r
18 \r
19 namespace caspar { namespace core { namespace ffmpeg{\r
20 \r
21 struct video_decoder::implementation : boost::noncopyable\r
22 {\r
23         implementation(AVCodecContext* codec_context) : codec_context_(codec_context){}\r
24 \r
25         std::shared_ptr<AVFrame> execute(const aligned_buffer& video_packet)\r
26         {               \r
27                 std::shared_ptr<AVFrame> decoded_frame(avcodec_alloc_frame(), av_free);\r
28 \r
29                 int frame_finished = 0;\r
30                 const int result = avcodec_decode_video(codec_context_, decoded_frame.get(), &frame_finished, video_packet.data(), video_packet.size());\r
31                 if(result < 0)                                          \r
32                         return nullptr;                 \r
33                 \r
34                 return decoded_frame;           \r
35         }\r
36         \r
37         AVCodecContext* codec_context_;\r
38 };\r
39 \r
40 video_decoder::video_decoder(AVCodecContext* codec_context) : impl_(new implementation(codec_context)){}\r
41 std::shared_ptr<AVFrame> video_decoder::execute(const aligned_buffer& video_packet){return impl_->execute(video_packet);}\r
42 }}}