2 Copyright 2004-2005 Chris Tallon, 2009,2012 Marten Richter
4 This file is part of VOMP.
6 VOMP is free software; you can redistribute it and/or modify
7 it under the terms of the GNU General Public License as published by
8 the Free Software Foundation; either version 2 of the License, or
9 (at your option) any later version.
11 VOMP is distributed in the hope that it will be useful,
12 but WITHOUT ANY WARRANTY; without even the implied warranty of
13 MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the
14 GNU General Public License for more details.
16 You should have received a copy of the GNU General Public License
17 along with VOMP. If not, see <https://www.gnu.org/licenses/>.
26 #include <sys/ioctl.h>
30 #include <libavcodec/avcodec.h>
31 #include <libavformat/avformat.h>
32 #include <libswresample/swresample.h>
39 class AudioOMX : public Audio
41 friend class VideoOMX;
46 int init(UCHAR streamType);
49 int setStreamType(UCHAR streamType);
58 int setVolume(int volume);
61 bool supportsAc3() { return true; }
62 bool maysupportAc3(){return true;}
63 bool streamTypeSupported(int streamtype)
66 case 0x11: //AAC LATM packaging
68 case 3: //mpeg 1 layer 1 and 2
77 //Writing Data to Audiodevice
78 virtual void PrepareMediaSample(const MediaPacketList&, UINT samplepos);
79 virtual UINT DeliverMediaSample(UCHAR* buffer, UINT *samplepos);
80 UINT DeliverMediaPacket(MediaPacket packet, const UCHAR* buffer,UINT *samplepos);
82 virtual long long SetStartOffset(long long curreftime, bool *rsync);
83 virtual void ResetTimeOffsets();
85 virtual bool DrainTargetReady() {return omx_running;};
86 virtual bool DrainTargetBufferFull();
89 UCHAR getLastAType() {return lastAType;}
91 bool loadOptionsFromServer(VDR* vdr);
92 bool saveOptionstoServer();
93 bool addOptionsToPanes(int panenumber,Options *options,WOptionPane* pane);
94 bool handleOptionChanges(Option* option);
111 bool hdmi; // use hdmi as audio output
112 bool passthrough; // use audio passthrough for the current audio type
118 bool canpass_pcm_mch;
122 int prefered_ac3; //0 stereo PCM, 1 passthrough 2 Multichannel PCM
128 static OMX_ERRORTYPE EmptyBufferDone_OMX(OMX_IN OMX_HANDLETYPE hcomp,OMX_IN OMX_PTR appdata,OMX_IN OMX_BUFFERHEADERTYPE* bulibaver);
129 static OMX_ERRORTYPE FillBufferDone_OMX(OMX_IN OMX_HANDLETYPE hcomp, OMX_IN OMX_PTR appdata,OMX_IN OMX_BUFFERHEADERTYPE* bulibaver);
133 unsigned int AdvanceAc3AudioSync(const UCHAR *data,unsigned int size,unsigned int *framesize);
134 unsigned int AdvanceAacLatmAudioSync(const UCHAR *data,unsigned int size,unsigned int *framesize);
135 unsigned int AdvanceMpAudioSync(const UCHAR *data,unsigned int size,unsigned int *framesize);
138 void ReturnEmptyOMXBuffer(OMX_BUFFERHEADERTYPE* bulibaver);
140 // OMX_HANDLETYPE omx_aud_dec;
141 OMX_HANDLETYPE omx_aud_rend;
142 OMX_HANDLETYPE omx_clock;
144 //OMX_U32 omx_codec_input_port;
145 //OMX_U32 omx_codec_output_port;
146 OMX_U32 omx_rend_input_port;
147 OMX_U32 omx_rend_clock_port;
148 OMX_U32 omx_clock_output_port;
150 long long lastreftimeOMX;
151 ULLONG lastreftimePTS;
155 int AllocateCodecsOMX();
156 int DeAllocateCodecsOMX();
158 int PrepareInputBufsOMX(bool setportdef);
159 int DestroyInputBufsOMX();
160 int DestroyInputBufsOMXwhilePlaying();
162 int ChangeAudioPortConfig(bool disport);
163 int ChangeAudioDestination();
164 long long correctAudioLatency(long long pts,int addsamples,int srate);
166 std::vector<OMX_BUFFERHEADERTYPE*> input_bufs_omx_all;
167 std::list<OMX_BUFFERHEADERTYPE*> input_bufs_omx_free;
168 std::mutex input_bufs_omx_mutex;
169 OMX_BUFFERHEADERTYPE* cur_input_buf_omx;
172 bool omx_first_frame;
173 std::mutex libav_mutex;
175 AVCodec *aaclatmcodec_libav;
176 AVCodecContext *aaclatmcodec_context_libav;
177 AVCodec *ac3codec_libav;
178 AVCodecContext *ac3codec_context_libav;
179 AVCodec *mp23codec_libav;
180 AVCodecContext *mp23codec_context_libav;
181 AVPacket incoming_paket_libav;
182 AVFrame *decode_frame_libav;
183 SwrContext* resam_con_libav;
186 UCHAR * decompress_buffer;
187 unsigned int decompress_buffer_size;
188 unsigned int decompress_buffer_filled;
191 unsigned int mp3sameheader;
192 int mp3sameheadercount;
195 int InitDecoderLibAV();
196 void DeinitDecoderLibAV();
198 char L_VPE_OMX_AUDIO_REND[128];