tmp
[blender.git] / extern / audaspace / plugins / ffmpeg / FFMPEGReader.h
1 /*******************************************************************************
2  * Copyright 2009-2016 Jörg Müller
3  *
4  * Licensed under the Apache License, Version 2.0 (the "License");
5  * you may not use this file except in compliance with the License.
6  * You may obtain a copy of the License at
7  *
8  *   http://www.apache.org/licenses/LICENSE-2.0
9  *
10  * Unless required by applicable law or agreed to in writing, software
11  * distributed under the License is distributed on an "AS IS" BASIS,
12  * WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied.
13  * See the License for the specific language governing permissions and
14  * limitations under the License.
15  ******************************************************************************/
16
17 #pragma once
18
19 #ifdef FFMPEG_PLUGIN
20 #define AUD_BUILD_PLUGIN
21 #endif
22
23 /**
24  * @file FFMPEGReader.h
25  * @ingroup plugin
26  * The FFMPEGReader class.
27  */
28
29 #include "respec/ConverterFunctions.h"
30 #include "IReader.h"
31 #include "util/Buffer.h"
32
33 #include <string>
34 #include <memory>
35
36 struct AVCodecContext;
37 extern "C" {
38 #include <libavformat/avformat.h>
39 }
40
41 AUD_NAMESPACE_BEGIN
42
43 /**
44  * This class reads a sound file via ffmpeg.
45  * \warning Seeking may not be accurate! Moreover the position is updated after
46  *          a buffer reading call. So calling getPosition right after seek
47  *          normally results in a wrong value.
48  */
49 class AUD_PLUGIN_API FFMPEGReader : public IReader
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         DeviceSpecs m_specs;
61
62         /**
63          * The buffer for package reading.
64          */
65         Buffer m_pkgbuf;
66
67         /**
68          * The count of samples still available from the last read package.
69          */
70         int m_pkgbuf_left;
71
72         /**
73          * The AVFormatContext structure for using ffmpeg.
74          */
75         AVFormatContext* m_formatCtx;
76
77         /**
78          * The AVCodecContext structure for using ffmpeg.
79          */
80         AVCodecContext* m_codecCtx;
81
82         /**
83          * The AVIOContext to read the data from.
84          */
85         AVIOContext* m_aviocontext;
86
87         /**
88          * The stream ID in the file.
89          */
90         int m_stream;
91
92         /**
93          * Converter function.
94          */
95         convert_f m_convert;
96
97         /**
98          * The memory file to read from.
99          */
100         std::shared_ptr<Buffer> m_membuffer;
101
102         /**
103          * The buffer to read with.
104          */
105         data_t* m_membuf;
106
107         /**
108          * Reading position of the buffer.
109          */
110         int64_t m_membufferpos;
111
112         /**
113          * Whether the audio data has to be interleaved after reading.
114          */
115         bool m_tointerleave;
116
117         /**
118          * Decodes a packet into the given buffer.
119          * \param packet The AVPacket to decode.
120          * \param buffer The target buffer.
121          * \return The count of read bytes.
122          */
123         AUD_LOCAL int decode(AVPacket& packet, Buffer& buffer);
124
125         /**
126          * Initializes the object.
127          */
128         AUD_LOCAL void init();
129
130         // delete copy constructor and operator=
131         FFMPEGReader(const FFMPEGReader&) = delete;
132         FFMPEGReader& operator=(const FFMPEGReader&) = delete;
133
134 public:
135         /**
136          * Creates a new reader.
137          * \param filename The path to the file to be read.
138          * \exception Exception Thrown if the file specified does not exist or
139          *            cannot be read with ffmpeg.
140          */
141         FFMPEGReader(std::string filename);
142
143         /**
144          * Creates a new reader.
145          * \param buffer The buffer to read from.
146          * \exception Exception Thrown if the buffer specified cannot be read
147          *                          with ffmpeg.
148          */
149         FFMPEGReader(std::shared_ptr<Buffer> buffer);
150
151         /**
152          * Destroys the reader and closes the file.
153          */
154         virtual ~FFMPEGReader();
155
156         /**
157          * Reads data to a memory buffer.
158          * This function is used for avio only.
159          * @param opaque The FFMPEGReader.
160          * @param buf The buffer to read to.
161          * @param buf_size The size of the buffer.
162          * @return How many bytes have been read.
163          */
164         static int read_packet(void* opaque, uint8_t* buf, int buf_size);
165
166         /**
167          * Seeks within data.
168          * This function is used for avio only.
169          * @param opaque The FFMPEGReader.
170          * @param offset The byte offset to seek to.
171          * @param whence The seeking action.
172          * @return The current position or the size of the data if requested.
173          */
174         static int64_t seek_packet(void* opaque, int64_t offset, int whence);
175
176         virtual bool isSeekable() const;
177         virtual void seek(int position);
178         virtual int getLength() const;
179         virtual int getPosition() const;
180         virtual Specs getSpecs() const;
181         virtual void read(int& length, bool& eos, sample_t* buffer);
182 };
183
184 AUD_NAMESPACE_END