3 #include "../../frame/Frame.h"
\r
4 #include "../../audio/AudioManager.h"
\r
6 #include <tbb/scalable_allocator.h>
\r
7 #include <type_traits>
\r
9 #include <boost/noncopyable.hpp>
\r
11 #if defined(_MSC_VER)
\r
12 #pragma warning (push)
\r
13 #pragma warning (disable : 4244)
\r
17 #define __STDC_CONSTANT_MACROS
\r
18 #define __STDC_LIMIT_MACROS
\r
19 #include <libavformat/avformat.h>
\r
21 #if defined(_MSC_VER)
\r
22 #pragma warning (pop)
\r
25 namespace caspar{ namespace ffmpeg{
\r
27 typedef std::tr1::shared_ptr<AVFrame> AVFramePtr;
\r
28 typedef std::tr1::shared_ptr<AVPacket> AVPacketPtr;
\r
30 struct video_packet : boost::noncopyable
\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
36 memcpy(data.data(), packet.data, packet.size);
\r
40 std::vector<uint8_t> data;
\r
41 AVCodecContext* const codec_context;
\r
42 const AVCodec* const codec;
\r
44 AVFramePtr decoded_frame;
\r
46 typedef std::shared_ptr<video_packet> video_packet_ptr;
\r
48 struct audio_packet : boost::noncopyable
\r
50 audio_packet(const AVPacket& packet, AVCodecContext* codec_context, AVCodec* codec, double frame_rate = 25.0)
\r
53 codec_context(codec_context),
\r
57 memcpy(data.data(), packet.data, packet.size);
\r
59 size_t bytesPerSec = (codec_context->sample_rate * codec_context->channels * 2);
\r
61 audio_frame_size = bytesPerSec / 25;
\r
62 src_audio_frame_size = static_cast<size_t>(static_cast<double>(bytesPerSec) / frame_rate);
\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
70 size_t src_audio_frame_size;
\r
71 size_t audio_frame_size;
\r
73 AVCodecContext* const codec_context;
\r
74 const AVCodec* const codec;
\r
76 std::vector<uint8_t> data;
\r
78 std::vector<audio::AudioDataChunkPtr> audio_chunks;
\r
80 typedef std::shared_ptr<audio_packet> audio_packet_ptr;
\r