]> git.sesse.net Git - casparcg/blob - server/producers/ffmpeg/packet.h
1.8.1:
[casparcg] / server / producers / ffmpeg / packet.h
1 #pragma once\r
2 \r
3 #include "../../frame/Frame.h"\r
4 #include "../../audio/AudioManager.h"\r
5 \r
6 #include <tbb/scalable_allocator.h>\r
7 #include <type_traits>\r
8 \r
9 #include <boost/noncopyable.hpp>\r
10 \r
11 #if defined(_MSC_VER)\r
12 #pragma warning (push)\r
13 #pragma warning (disable : 4244)\r
14 #endif\r
15 extern "C" \r
16 {\r
17         #define __STDC_CONSTANT_MACROS\r
18         #define __STDC_LIMIT_MACROS\r
19         #include <libavformat/avformat.h>\r
20 }\r
21 #if defined(_MSC_VER)\r
22 #pragma warning (pop)\r
23 #endif\r
24 \r
25 namespace caspar{ namespace ffmpeg{\r
26 \r
27 typedef std::tr1::shared_ptr<AVFrame> AVFramePtr;       \r
28 typedef std::tr1::shared_ptr<AVPacket> AVPacketPtr;\r
29 \r
30 struct video_packet : boost::noncopyable\r
31 {\r
32         video_packet(const AVPacket& packet, FramePtr&& frame, AVCodecContext* codec_context, AVCodec* codec) \r
33                 :  size(packet.size), codec_context(codec_context), codec(codec), frame(std::move(frame)), \r
34                         data(packet.size), decoded_frame(avcodec_alloc_frame(), av_free)\r
35         {\r
36                 memcpy(data.data(), packet.data, packet.size);\r
37         }\r
38                         \r
39         const size_t                                    size;\r
40         std::vector<uint8_t>                    data;\r
41         AVCodecContext* const                   codec_context;\r
42         const AVCodec* const                    codec;\r
43         FramePtr                                                frame;\r
44         AVFramePtr                                              decoded_frame;\r
45 };      \r
46 typedef std::shared_ptr<video_packet> video_packet_ptr;\r
47 \r
48 struct audio_packet : boost::noncopyable\r
49 {\r
50         audio_packet(const AVPacket& packet, AVCodecContext* codec_context, AVCodec* codec, double frame_rate = 25.0) \r
51                 : \r
52                 size(packet.size), \r
53                 codec_context(codec_context), \r
54                 codec(codec),\r
55                 data(packet.size)\r
56         {\r
57                 memcpy(data.data(), packet.data, packet.size);\r
58 \r
59                 size_t bytesPerSec = (codec_context->sample_rate * codec_context->channels * 2);\r
60 \r
61                 audio_frame_size = bytesPerSec / 25;\r
62                 src_audio_frame_size = static_cast<size_t>(static_cast<double>(bytesPerSec) / frame_rate);\r
63 \r
64                 //make sure the framesize is a multiple of the samplesize\r
65                 int sourceSizeMod = src_audio_frame_size % (codec_context->channels * 2);\r
66                 if(sourceSizeMod != 0)\r
67                         src_audio_frame_size += (codec_context->channels * 2) - sourceSizeMod;\r
68         }\r
69                                 \r
70         size_t                                  src_audio_frame_size;\r
71         size_t                                  audio_frame_size;\r
72 \r
73         AVCodecContext* const   codec_context;\r
74         const AVCodec* const    codec;\r
75         const size_t                    size;\r
76         std::vector<uint8_t>    data;\r
77 \r
78         std::vector<audio::AudioDataChunkPtr> audio_chunks;\r
79 };\r
80 typedef std::shared_ptr<audio_packet> audio_packet_ptr;\r
81 \r
82         }\r
83 }\r