3D Audio GSoC:
[blender.git] / intern / audaspace / ffmpeg / AUD_FFMPEGWriter.h
1 /*
2  * $Id$
3  *
4  * ***** BEGIN GPL LICENSE BLOCK *****
5  *
6  * Copyright 2009-2011 Jörg Hermann Müller
7  *
8  * This file is part of AudaSpace.
9  *
10  * Audaspace is free software; you can redistribute it and/or modify
11  * it under the terms of the GNU General Public License as published by
12  * the Free Software Foundation; either version 2 of the License, or
13  * (at your option) any later version.
14  *
15  * AudaSpace is distributed in the hope that it will be useful,
16  * but WITHOUT ANY WARRANTY; without even the implied warranty of
17  * MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE.  See the
18  * GNU General Public License for more details.
19  *
20  * You should have received a copy of the GNU General Public License
21  * along with Audaspace; if not, write to the Free Software Foundation,
22  * Inc., 51 Franklin Street, Fifth Floor, Boston, MA 02110-1301, USA.
23  *
24  * ***** END GPL LICENSE BLOCK *****
25  */
26
27 /** \file audaspace/ffmpeg/AUD_FFMPEGWriter.h
28  *  \ingroup audffmpeg
29  */
30
31
32 #ifndef AUD_FFMPEGWRITER
33 #define AUD_FFMPEGWRITER
34
35 #include "AUD_ConverterFunctions.h"
36 #include "AUD_Buffer.h"
37 #include "AUD_IWriter.h"
38
39 #include <string>
40
41 struct AVCodecContext;
42 extern "C" {
43 #include <libavformat/avformat.h>
44 }
45
46 /**
47  * This class writes a sound file via ffmpeg.
48  */
49 class AUD_FFMPEGWriter : public AUD_IWriter
50 {
51 private:
52         /**
53          * The current position in samples.
54          */
55         int m_position;
56
57         /**
58          * The specification of the audio data.
59          */
60         AUD_DeviceSpecs m_specs;
61
62         /**
63          * The AVFormatContext structure for using ffmpeg.
64          */
65         AVFormatContext* m_formatCtx;
66
67         /**
68          * The AVCodecContext structure for using ffmpeg.
69          */
70         AVCodecContext* m_codecCtx;
71
72         AVOutputFormat* m_outputFmt;
73
74         AVStream* m_stream;
75
76         AUD_Buffer m_input_buffer;
77
78         AUD_Buffer m_output_buffer;
79
80         unsigned int m_input_samples;
81
82         unsigned int m_input_size;
83
84         /**
85          * Converter function.
86          */
87         AUD_convert_f m_convert;
88
89         // hide copy constructor and operator=
90         AUD_FFMPEGWriter(const AUD_FFMPEGWriter&);
91         AUD_FFMPEGWriter& operator=(const AUD_FFMPEGWriter&);
92
93         void encode(sample_t* data);
94
95 public:
96         /**
97          * Creates a new writer.
98          * \param filename The path to the file to be read.
99          * \exception AUD_Exception Thrown if the file specified does not exist or
100          *            cannot be read with ffmpeg.
101          */
102         AUD_FFMPEGWriter(std::string filename, AUD_DeviceSpecs specs, AUD_Container format, AUD_Codec codec, unsigned int bitrate);
103
104         /**
105          * Destroys the writer and closes the file.
106          */
107         virtual ~AUD_FFMPEGWriter();
108
109         virtual int getPosition() const;
110         virtual AUD_DeviceSpecs getSpecs() const;
111         virtual void write(unsigned int length, sample_t* buffer);
112 };
113
114 #endif //AUD_FFMPEGWRITER