2 Copyright 2004-2005 Chris Tallon, 2009 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 "woptionpane.h"
27 #include "osdopenvg.h"
31 #include "libavutil/channel_layout.h"
32 #include "libavutil/opt.h"
37 static const char* TAG = "AudioOMX";
45 lastAType = MPTYPE_MPEG_AUDIO;
51 canpass_pcm_mch = false;
53 prefered_ac3 = 0; //0 stereo PCM, 1 passthrough 2 Multichannel PCM
61 omx_aud_rend/*dec*/ = 0;
62 cur_input_buf_omx = NULL;
64 ac3codec_libav = NULL;
65 ac3codec_context_libav = NULL;
67 mp23codec_libav = NULL;
68 mp23codec_context_libav = NULL;
70 resam_con_libav = NULL;
72 decompress_buffer = NULL;
73 decompress_buffer_size = 0;
74 decompress_buffer_filled = 0;
76 mp3sameheadercount = 0;
78 strcpy(L_VPE_OMX_AUDIO_REND, VPE_OMX_AUDIO_REND);
85 int AudioOMX::init(u1 tstreamType)
92 streamType = tstreamType;
102 decompress_buffer_size = 20000;
103 decompress_buffer = static_cast<u1*>(malloc(decompress_buffer_size));
104 decompress_buffer_filled = 0;
106 #if LIBAVFORMAT_VERSION_INT < AV_VERSION_INT(58, 9, 100)
110 av_log_set_flags(AV_LOG_SKIP_REPEATED);
112 ac3codec_libav = avcodec_find_decoder(AV_CODEC_ID_AC3);
114 if (ac3codec_libav == NULL)
116 LogNT::getInstance()->debug(TAG, "Find libav ac3 decoder failed");
120 mp23codec_libav = avcodec_find_decoder(AV_CODEC_ID_MP3);
122 if (mp23codec_libav == NULL)
124 LogNT::getInstance()->debug(TAG, "Find libav mpeg audio decoder failed");
128 aaclatmcodec_libav = avcodec_find_decoder(AV_CODEC_ID_AAC_LATM);
130 if (aaclatmcodec_libav == NULL)
132 LogNT::getInstance()->debug(TAG, "Find libav aac latm decoder failed");
138 ret = vc_tv_hdmi_audio_supported( EDID_AudioFormat_eMPEG1, 2, EDID_AudioSampleRate_e48KHz, 0);
144 LogNT::getInstance()->info(TAG, "TV hdmi supports mpeg1 layer 1 and 2");
147 ret = vc_tv_hdmi_audio_supported( EDID_AudioFormat_eMP3, 2, EDID_AudioSampleRate_e48KHz, 0);
153 LogNT::getInstance()->info(TAG, "TV hdmi supports mpeg1 layer 3");
156 ret = vc_tv_hdmi_audio_supported( EDID_AudioFormat_eAC3, 6, EDID_AudioSampleRate_e48KHz, 0);
161 LogNT::getInstance()->info(TAG, "TV hdmi supports AC3");
164 ret = vc_tv_hdmi_audio_supported( EDID_AudioFormat_eAAC, 6, EDID_AudioSampleRate_e48KHz, 0);
170 LogNT::getInstance()->info(TAG, "TV hdmi supports AAC");
173 canpass_pcm_mch = false;
178 int AudioOMX::initAllParams()
180 return (setStreamType(streamType) && setChannel() && setSource());
183 int AudioOMX::shutdown()
185 if (!initted) return 0;
189 LogNT::getInstance()->debug(TAG, "audio shutdown called");
190 DeAllocateCodecsOMX();
192 free(decompress_buffer);
193 decompress_buffer = NULL;
194 decompress_buffer_size = 0;
195 decompress_buffer_filled = 0;
200 bool AudioOMX::loadOptionsFromServer(VDR* vdr)
202 LogNT::getInstance()->debug(TAG, "AudioOMX config load");
203 char* name = vdr->configLoad("AudioOMX", "AC3DecodingMode");
207 if (STRCASECMP(name, "PCM") == 0)
211 else if (STRCASECMP(name, "Passthrough") == 0)
215 else if (STRCASECMP(name, "PCMMultichannel") == 0)
223 name = vdr->configLoad("AudioOMX", "Mp2DecodingMode");
227 if (STRCASECMP(name, "PCM") == 0)
231 else if (STRCASECMP(name, "Passthrough") == 0)
235 else if (STRCASECMP(name, "PCMMultichannel") == 0)
243 name = vdr->configLoad("AudioOMX", "AACDecodingMode");
247 if (STRCASECMP(name, "PCM") == 0)
251 else if (STRCASECMP(name, "Passthrough") == 0)
255 else if (STRCASECMP(name, "PCMMultichannel") == 0)
263 name = vdr->configLoad("AudioOMX", "Mp3DecodingMode");
267 if (STRCASECMP(name, "PCM") == 0)
271 else if (STRCASECMP(name, "Passthrough") == 0)
275 else if (STRCASECMP(name, "PCMMultichannel") == 0)
283 name = vdr->configLoad("AudioOMX", "AudioOutput");
287 if (STRCASECMP(name, "analog") == 0)
291 else if (STRCASECMP(name, "HDMI") == 0)
304 bool AudioOMX::handleOptionChanges(Option* option)
306 if (Audio::handleOptionChanges(option))
313 if (STRCASECMP(option->options[option->userSetChoice], "analog") == 0)
317 else if (STRCASECMP(option->options[option->userSetChoice], "HDMI")
329 if (STRCASECMP(option->options[option->userSetChoice], "PCM") == 0)
333 else if (STRCASECMP(option->options[option->userSetChoice], "Passthrough") == 0)
337 else if (STRCASECMP(option->options[option->userSetChoice], "PCMMultichannel") == 0)
346 if (STRCASECMP(option->options[option->userSetChoice], "PCM") == 0)
350 else if (STRCASECMP(option->options[option->userSetChoice], "Passthrough") == 0)
354 else if (STRCASECMP(option->options[option->userSetChoice], "PCMMultichannel") == 0)
363 if (STRCASECMP(option->options[option->userSetChoice], "PCM") == 0)
367 else if (STRCASECMP(option->options[option->userSetChoice], "Passthrough") == 0)
371 else if (STRCASECMP(option->options[option->userSetChoice], "PCMMultichannel") == 0)
380 if (STRCASECMP(option->options[option->userSetChoice], "PCM") == 0)
384 else if (STRCASECMP(option->options[option->userSetChoice], "Passthrough") == 0)
388 else if (STRCASECMP(option->options[option->userSetChoice], "PCMMultichannel") == 0)
400 bool AudioOMX::saveOptionstoServer()
403 switch (prefered_ac3)
406 VDR::getInstance()->configSave("AudioOMX", "AC3DecodingMode", "PCM");
410 VDR::getInstance()->configSave("AudioOMX", "AC3DecodingMode", "Passthrough");
414 VDR::getInstance()->configSave("AudioOMX", "AC3DecodingMode", "PCMMultichannel");
418 switch (prefered_aac)
421 VDR::getInstance()->configSave("AudioOMX", "AACDecodingMode", "PCM");
425 VDR::getInstance()->configSave("AudioOMX", "AACDecodingMode", "Passthrough");
429 VDR::getInstance()->configSave("AudioOMX", "AACDecodingMode", "PCMMultichannel");
433 switch (prefered_mp2)
436 VDR::getInstance()->configSave("AudioOMX", "Mp2DecodingMode", "PCM");
440 VDR::getInstance()->configSave("AudioOMX", "Mp2DecodingMode", "Passthrough");
444 VDR::getInstance()->configSave("AudioOMX", "Mp2DecodingMode", "PCMMultichannel");
448 switch (prefered_mp3)
451 VDR::getInstance()->configSave("AudioOMX", "Mp3DecodingMode", "PCM");
455 VDR::getInstance()->configSave("AudioOMX", "Mp3DecodingMode", "Passthrough");
459 VDR::getInstance()->configSave("AudioOMX", "Mp3DecodingMode", "PCMMultichannel");
464 VDR::getInstance()->configSave("AudioOMX", "AudioOutput", "analog");
466 VDR::getInstance()->configSave("AudioOMX", "AudioOutput", "HDMI");
472 /*Option(u4 id, const char* displayText, const char* configSection, const char* configKey, u4 optionType,
473 u4 numChoices, u4 defaultChoice, u4 startInt,
474 const char * const * options, const char * const * optionkeys = NULL, AbstractOption* handler=NULL);*/
476 bool AudioOMX::addOptionsToPanes(int panenumber, Options* options, WOptionPane* pane)
478 if (!Audio::addOptionsToPanes(panenumber, options, pane)) return false;
484 static const char* audioopts[] = {"analog", "HDMI"};
485 option = new Option(4, tr("Audio Output"), "AudioOMX", "AudioOutput", Option::TYPE_TEXT, 2, 0, 0, audioopts, NULL, false, this);
486 options->push_back(option);
487 pane->addOptionLine(option);
490 char** ac3opts = new char* [3];
492 ac3opts[i] = new char[strlen("PCM") + 1];
493 strcpy(ac3opts[i], "PCM");
498 ac3opts[i] = new char[strlen("Passthrough") + 1];
499 strcpy(ac3opts[i], "PassThrough");
505 ac3opts[i] = new char[strlen("PCMMultichannel") + 1];
506 strcpy(ac3opts[i], "PCMMultichannel");
510 option = new Option(1, tr("AC3 HDMI Mode"), "AudioOMX", "AC3DecodingMode", Option::TYPE_TEXT, i, 0, 0, ac3opts, NULL, true, this);
511 options->push_back(option);
512 pane->addOptionLine(option);
514 /* char **aacopts = new char *[3];
516 aacopts[i] = new char[strlen("PCM") + 1];
517 strcpy(mp2opts[i], "PCM");
520 aacopts[i] = new char[strlen("Passthrough") + 1];
521 strcpy(aacopts[i], "PassThrough");
524 if (canpass_pcm_mch) {
525 aacopts[i] = new char[strlen("PCMMultichannel") + 1];
526 strcpy(aacopts[i], "PCMMultichannel");
529 option = new Option(5, tr("Mp2 HDMI Mode"), "AudioOMX",
530 "AACDecodingMode", Option::TYPE_TEXT, i, 0, 0,
531 aacopts, NULL, true, this);
532 options->push_back(option);
533 pane->addOptionLine(option);
536 char **mp2opts = new char *[3];
538 mp2opts[i] = new char[strlen("PCM") + 1];
539 strcpy(mp2opts[i], "PCM");
542 mp2opts[i] = new char[strlen("Passthrough") + 1];
543 strcpy(mp2opts[i], "PassThrough");
546 if (canpass_pcm_mch) {
547 mp2opts[i] = new char[strlen("PCMMultichannel") + 1];
548 strcpy(mp2opts[i], "PCMMultichannel");
551 option = new Option(2, tr("Mp2 HDMI Mode"), "AudioOMX",
552 "Mp2DecodingMode", Option::TYPE_TEXT, i, 0, 0,
553 mp2opts, NULL, true, this);
554 options->push_back(option);
555 pane->addOptionLine(option);
557 char **mp3opts = new char *[3];
559 mp3opts[i] = new char[strlen("PCM") + 1];
560 strcpy(mp3opts[i], "PCM");
563 mp3opts[i] = new char[strlen("Passthrough") + 1];
564 strcpy(mp3opts[i], "PassThrough");
567 if (canpass_pcm_mch) {
568 mp3opts[i] = new char[strlen("PCMMultichannel") + 1];
569 strcpy(mp3opts[i], "PCMMultichannel");
572 option = new Option(3, tr("Mp3 HDMI Mode"), "AudioOMX",
573 "Mp2DecodingMode", Option::TYPE_TEXT, i, 0, 0, mp3opts,
575 options->push_back(option);
576 pane->addOptionLine(option);*/
577 // Comment unsupported modes out
584 OMX_ERRORTYPE AudioOMX::EmptyBufferDone_OMX(OMX_IN OMX_HANDLETYPE /* hcomp */, OMX_IN OMX_PTR /* appdata */, OMX_IN OMX_BUFFERHEADERTYPE* buffer)
586 //LogNT::getInstance()->info(TAG, "EmptyBufferDone");
587 AudioOMX* audio = static_cast<AudioOMX*>(getInstance());
588 audio->ReturnEmptyOMXBuffer(buffer);
589 return OMX_ErrorNone;
592 void AudioOMX::ReturnEmptyOMXBuffer(OMX_BUFFERHEADERTYPE* buffer)
594 input_bufs_omx_mutex.lock();
595 //LogNT::getInstance()->info(TAG, "ReturnEmptyOMXBuffer {}",input_bufs_omx_free.size());
596 input_bufs_omx_free.push_back(buffer);
597 //LogNT::getInstance()->info(TAG, "ReturnEmptyOMXBuffer {}",input_bufs_omx_free.size());
598 input_bufs_omx_mutex.unlock();
599 VideoOMX* video = static_cast<VideoOMX*>(Video::getInstance());
603 OMX_ERRORTYPE AudioOMX::FillBufferDone_OMX(OMX_IN OMX_HANDLETYPE /* hcomp */, OMX_IN OMX_PTR /* appdata */, OMX_IN OMX_BUFFERHEADERTYPE* /* buffer */)
605 LogNT::getInstance()->info(TAG, "FillBufferDone");
606 VideoOMX* video = static_cast<VideoOMX*>(Video::getInstance());
608 return OMX_ErrorNone;
611 int AudioOMX::setStreamType(u1 /* type */)
613 if (!initted) return 0;
615 // if (ioctl(fdAudio, AV_SET_AUD_STREAMTYPE, type) != 0) return 0;
619 int AudioOMX::setChannel()
621 if (!initted) return 0;
623 // if (ioctl(fdAudio, AV_SET_AUD_CHANNEL, 0) != 0) return 0;
627 int AudioOMX::setSource()
629 if (!initted) return 0;
631 // if (ioctl(fdAudio, AV_SET_AUD_SRC, 1) != 0) return 0;
637 if (!initted) return 0;
639 // if (ioctl(fdAudio, AV_SET_AUD_SYNC, 2) != 0) return 0;
645 if (!initted) return 0;
647 lastAType = MPTYPE_MPEG_AUDIO;
648 LogNT::getInstance()->debug(TAG, "enter play");
650 static_cast<VideoOMX*>(Video::getInstance())->interlaceSwitch4Demux(); // switch resolution if necessary
652 if (!AllocateCodecsOMX())
660 int AudioOMX::ChangeAudioDestination() //clock aka omx mutex needs to be locked
663 const char* destinations[] = {"local", "hdmi"};
669 OMX_CONFIG_BRCMAUDIODESTINATIONTYPE auddest;
670 memset(&auddest, 0, sizeof(auddest));
671 auddest.nSize = sizeof(auddest);
672 auddest.nVersion.nVersion = OMX_VERSION;
673 strcpy((char*)auddest.sName, destinations[dest]);
675 LogNT::getInstance()->debug(TAG, "setting destination to: {}", auddest.sName);
676 error = OMX_SetConfig(omx_aud_rend, OMX_IndexConfigBrcmAudioDestination, &auddest);
678 if (error != OMX_ErrorNone)
680 LogNT::getInstance()->debug(TAG, "Init OMX_IndexConfigBrcmAudioDestination failed {:#x} {:#x} {}", error, omx_aud_rend, auddest.sName);
681 DeAllocateCodecsOMX();
688 int AudioOMX::ChangeAudioPortConfig(bool disport) //clock aka omx mutex needs to be locked
691 //Ok first fidle a working configuration
692 LogNT::getInstance()->debug(TAG, "ChangeAudioPortConfig");
694 OMX_AUDIO_CODINGTYPE encoding;
700 case MPTYPE_MPEG_AUDIO:
702 if (prefered_mp2 == 2 && false) //not supported yet
708 if (prefered_mp2 == 1 && canpass_mp2)
711 encoding = OMX_AUDIO_CodingMP3;
716 encoding = OMX_AUDIO_CodingPCM;
722 case MPTYPE_AAC_LATM:
724 if (prefered_aac == 2 && false) //not supported yet
730 LogNT::getInstance()->debug(TAG, "ChangeAudioPortConfig debug {} {}", prefered_aac, canpass_aac);
732 if (prefered_aac == 1 && canpass_aac)
735 encoding = OMX_AUDIO_CodingAAC;
740 encoding = OMX_AUDIO_CodingPCM;
746 case MPTYPE_AC3_PRE13:
749 if (prefered_ac3 == 2 && false) //not supported yet
755 LogNT::getInstance()->debug(TAG, "ChangeAudioPortConfig debug {} {}", prefered_ac3, canpass_ac3);
757 if (prefered_ac3 == 1 && canpass_ac3)
760 encoding = OMX_AUDIO_CodingDDP;
765 encoding = OMX_AUDIO_CodingPCM;
771 case MPTYPE_MPEG_AUDIO_LAYER3:
773 if (prefered_mp3 == 2 && false) //not supported yet
779 if (prefered_mp3 == 1 && canpass_mp2)
782 encoding = OMX_AUDIO_CodingMP3;
787 encoding = OMX_AUDIO_CodingPCM;
797 encoding = OMX_AUDIO_CodingPCM;
798 //mch=false; // multichannel also false
803 /*OMX_CONFIG_BOOLEANTYPE booly;
804 memset(&booly, 0, sizeof(booly));
805 booly.nSize = sizeof(booly);
806 booly.nVersion.nVersion = OMX_VERSION;
808 booly.bEnabled = OMX_TRUE;
810 booly.bEnabled = OMX_FALSE;
812 error = OMX_SetParameter(omx_aud_dec, OMX_IndexParamBrcmDecoderPassThrough,
814 if (error != OMX_ErrorNone) {
815 LogNT::getInstance()->debug(TAG,
816 "Init OMX_IndexParamBrcmDecoderPassThrough failed {:#x}", error);
817 DeAllocateCodecsOMX();
820 VideoOMX* video = static_cast<VideoOMX*>(Video::getInstance());
824 video->DisablePort(omx_aud_rend, omx_rend_input_port, false);
825 //DestroyInputBufsOMXwhilePlaying();
826 //video->CommandFinished(omx_aud_rend,OMX_CommandPortDisable,omx_rend_input_port);
830 OMX_AUDIO_PARAM_PORTFORMATTYPE format;
831 memset(&format, 0, sizeof(format));
832 format.nSize = sizeof(format);
833 format.nVersion.nVersion = OMX_VERSION;
834 format.nPortIndex = omx_rend_input_port;
835 error = OMX_GetParameter(omx_aud_rend, OMX_IndexParamAudioPortFormat,
838 if (error != OMX_ErrorNone)
840 LogNT::getInstance()->debug(TAG, "Get OMX_IndexParamAudioPortFormat failed {:#x} {}", error, omx_rend_input_port);
846 LogNT::getInstance()->debug(TAG, "Get OMX_IndexParamAudioPortFormat returned {}", format.eEncoding );
848 format.eEncoding = encoding;
850 error = OMX_SetParameter(omx_aud_rend, OMX_IndexParamAudioPortFormat, &format);
852 if (error != OMX_ErrorNone)
854 LogNT::getInstance()->debug(TAG, "Set OMX_IndexParamAudioPortFormat failed {:#x} {} {}", error, omx_rend_input_port, format.eEncoding);
860 case OMX_AUDIO_CodingPCM:
862 OMX_AUDIO_PARAM_PCMMODETYPE audio_pcm;
863 memset(&audio_pcm, 0, sizeof(audio_pcm));
864 audio_pcm.nSize = sizeof(audio_pcm);
865 audio_pcm.nVersion.nVersion = OMX_VERSION;
866 audio_pcm.nChannels = 2;
867 audio_pcm.eChannelMapping[0] = OMX_AUDIO_ChannelLF;
868 audio_pcm.eChannelMapping[1] = OMX_AUDIO_ChannelRF;
869 //audio_pcm.eChannelMapping[2]=OMX_AUDIO_ChannelMax;
870 audio_pcm.eNumData = OMX_NumericalDataSigned;
871 audio_pcm.eEndian = OMX_EndianLittle;
872 audio_pcm.bInterleaved = OMX_TRUE;
873 audio_pcm.nBitPerSample = 16;
874 audio_pcm.ePCMMode = OMX_AUDIO_PCMModeLinear;
875 audio_pcm.nChannels = 2;
876 audio_pcm.nSamplingRate = 48000;
877 audio_pcm.nPortIndex = omx_rend_input_port;
878 error = OMX_SetParameter(omx_aud_rend, OMX_IndexParamAudioPcm, &audio_pcm);
880 if (error != OMX_ErrorNone)
882 LogNT::getInstance()->debug(TAG, "Init OMX_IndexParamAudioPcm failed {:#x} {}", error, omx_rend_input_port);
888 case OMX_AUDIO_CodingDDP:
890 OMX_AUDIO_PARAM_DDPTYPE audio_ddp;
891 memset(&audio_ddp, 0, sizeof(audio_ddp));
892 audio_ddp.nSize = sizeof(audio_ddp);
893 audio_ddp.nVersion.nVersion = OMX_VERSION;
894 audio_ddp.nPortIndex = omx_rend_input_port;
895 audio_ddp.nChannels = 8; //unknown
896 audio_ddp.nBitRate = 0;
897 audio_ddp.nSampleRate = 48000;
898 audio_ddp.eChannelMapping[0] = OMX_AUDIO_ChannelLF;
899 audio_ddp.eChannelMapping[1] = OMX_AUDIO_ChannelRF;
900 audio_ddp.eChannelMapping[2] = OMX_AUDIO_ChannelCF;
901 audio_ddp.eChannelMapping[3] = OMX_AUDIO_ChannelLFE;
902 audio_ddp.eChannelMapping[4] = OMX_AUDIO_ChannelLR;
903 audio_ddp.eChannelMapping[5] = OMX_AUDIO_ChannelRR;
904 audio_ddp.eChannelMapping[6] = OMX_AUDIO_ChannelLS;
905 audio_ddp.eChannelMapping[7] = OMX_AUDIO_ChannelRS;
906 audio_ddp.eChannelMapping[8] = OMX_AUDIO_ChannelCS;
907 error = OMX_SetParameter(omx_aud_rend, OMX_IndexParamAudioDdp, &audio_ddp);
909 if (error != OMX_ErrorNone)
911 LogNT::getInstance()->debug(TAG,
912 "Init OMX_IndexParamAudioDdp failed {:#x} {}", error,
913 omx_rend_input_port);
919 default: break; //Make compiler happy
925 //PrepareInputBufsOMX(false);
926 video->EnablePort(omx_aud_rend, omx_rend_input_port, false);
932 int AudioOMX::InitDecoderLibAV()
935 ac3codec_context_libav = avcodec_alloc_context3(ac3codec_libav);
937 if (!ac3codec_context_libav)
939 LogNT::getInstance()->debug(TAG, "Alloc avcodec for ac3 decoding context failed!");
943 #if LIBAVCODEC_VERSION_INT >= AV_VERSION_INT(56, 34, 1)
944 ac3codec_context_libav->flags |= AV_CODEC_FLAG_TRUNCATED;
946 ac3codec_context_libav->flags |= CODEC_FLAG_TRUNCATED;
949 #if LIBAVCODEC_VERSION_INT >= AV_VERSION_INT(57, 64, 101)
950 ac3codec_context_libav->request_channel_layout = 2;
952 ac3codec_context_libav->request_channels = 2;
955 int avc_ret = avcodec_open2(ac3codec_context_libav, ac3codec_libav, NULL);
959 LogNT::getInstance()->debug(TAG, "Opening libav codec failed");
960 libav_mutex.unlock();
964 aaclatmcodec_context_libav = avcodec_alloc_context3(aaclatmcodec_libav);
966 if (!aaclatmcodec_context_libav)
968 LogNT::getInstance()->debug(TAG, "Alloc avcodec for aac decoding context failed!");
972 #if LIBAVCODEC_VERSION_INT >= AV_VERSION_INT(56, 34, 1)
973 aaclatmcodec_context_libav->flags |= AV_CODEC_FLAG_TRUNCATED;
975 aaclatmcodec_context_libav->flags |= CODEC_FLAG_TRUNCATED;
978 #if LIBAVCODEC_VERSION_INT >= AV_VERSION_INT(57, 64, 101)
979 aaclatmcodec_context_libav->request_channel_layout = 2;
981 aaclatmcodec_context_libav->request_channels = 2;
984 avc_ret = avcodec_open2(aaclatmcodec_context_libav, aaclatmcodec_libav, NULL);
988 LogNT::getInstance()->debug(TAG, "Opening libav codec failed");
989 libav_mutex.unlock();
993 mp23codec_context_libav = avcodec_alloc_context3(mp23codec_libav);
995 if (!ac3codec_context_libav)
997 LogNT::getInstance()->debug(TAG, "Alloc avcodec for mp23 decoding context failed!");
998 libav_mutex.unlock();
1002 #if LIBAVCODEC_VERSION_INT >= AV_VERSION_INT(56, 34, 1)
1003 mp23codec_context_libav->flags |= AV_CODEC_FLAG_TRUNCATED;
1005 mp23codec_context_libav->flags |= CODEC_FLAG_TRUNCATED;
1008 #if LIBAVCODEC_VERSION_INT >= AV_VERSION_INT(57, 64, 101)
1009 mp23codec_context_libav->request_channel_layout = 2;
1011 mp23codec_context_libav->request_channels = 2;
1014 avc_ret = avcodec_open2(mp23codec_context_libav, mp23codec_libav, NULL);
1018 LogNT::getInstance()->debug(TAG, "Opening libav codec failed");
1019 libav_mutex.unlock();
1023 resam_con_libav = swr_alloc();
1025 if (resam_con_libav == NULL)
1027 LogNT::getInstance()->debug(TAG, "Alloc resample context failed");
1031 av_opt_set_int(resam_con_libav, "out_channel_layout", AV_CH_LAYOUT_STEREO, 0); // our standard format
1032 av_opt_set_int(resam_con_libav, "out_sample_rate", 48000, 0);
1033 av_opt_set_int(resam_con_libav, "out_sample_fmt", AV_SAMPLE_FMT_S16, 0);
1034 av_opt_set_int(resam_con_libav, "matrix_encoding", AV_MATRIX_ENCODING_DPLII, 0);
1036 av_opt_set_int(resam_con_libav, "in_sample_rate", 48000, 0);
1037 av_opt_set_int(resam_con_libav, "in_sample_fmt", AV_SAMPLE_FMT_S16, 0);
1038 av_opt_set_int(resam_con_libav, "in_channel_layout", AV_CH_LAYOUT_5POINT1, 0); //just an example
1040 av_init_packet(&incoming_paket_libav);
1041 #if LIBAVCODEC_VERSION_INT >= AV_VERSION_INT(57, 64, 101)
1042 decode_frame_libav = av_frame_alloc();
1044 decode_frame_libav = avcodec_alloc_frame();
1046 libav_mutex.unlock();
1047 decompress_buffer_filled = 0;
1052 void AudioOMX::DeinitDecoderLibAV()
1056 if (ac3codec_context_libav)
1058 avcodec_close(ac3codec_context_libav);
1059 av_free(ac3codec_context_libav);
1060 ac3codec_context_libav = NULL;
1062 avcodec_close(aaclatmcodec_context_libav);
1063 av_free(aaclatmcodec_context_libav);
1064 aaclatmcodec_context_libav = NULL;
1066 av_free(decode_frame_libav);
1068 avcodec_close(mp23codec_context_libav);
1069 av_free(mp23codec_context_libav);
1070 mp23codec_context_libav = NULL;
1072 swr_free(&resam_con_libav);
1073 resam_con_libav = NULL;
1076 libav_mutex.unlock();
1079 int AudioOMX::AllocateCodecsOMX()
1081 OMX_ERRORTYPE error;
1082 static OMX_CALLBACKTYPE callbacks = {&VideoOMX::EventHandler_OMX, &EmptyBufferDone_OMX, &FillBufferDone_OMX};
1084 LogNT::getInstance()->info(TAG, "Allocate Codecs OMX");
1085 //Clock, move later to audio
1086 VideoOMX* video = static_cast<VideoOMX*>(Video::getInstance());
1088 if (!InitDecoderLibAV()) return 0;;
1090 OMX_PORT_PARAM_TYPE p_param;
1091 memset(&p_param, 0, sizeof(p_param));
1092 p_param.nSize = sizeof(p_param);
1093 p_param.nVersion.nVersion = OMX_VERSION;
1095 if (!video->getClockAudioandInit(&omx_clock, &omx_clock_output_port))
1097 return 0;// get the clock and init it if necessary
1101 if (!video->idleClock())
1108 error = OMX_GetHandle(&omx_aud_rend, L_VPE_OMX_AUDIO_REND, NULL, &callbacks);
1110 if (error != OMX_ErrorNone)
1112 LogNT::getInstance()->debug(TAG, "Init OMX audio rend failed {:#x}", error);
1113 video->UnlockClock();
1114 DeAllocateCodecsOMX();
1118 if (!ChangeAudioDestination())
1120 video->UnlockClock();
1121 DeAllocateCodecsOMX();
1125 error = OMX_GetParameter(omx_aud_rend, OMX_IndexParamAudioInit, &p_param);
1127 if (error != OMX_ErrorNone)
1129 LogNT::getInstance()->debug(TAG, "Init OMX audio rend OMX_GetParameter failed {:#x}", error);
1130 video->UnlockClock();
1131 DeAllocateCodecsOMX();
1135 omx_rend_input_port = p_param.nStartPortNumber;
1137 error = OMX_GetParameter(omx_aud_rend, OMX_IndexParamOtherInit, &p_param);
1139 if (error != OMX_ErrorNone)
1141 LogNT::getInstance()->debug(TAG, "Init OMX aud rend OMX_GetParameter failed {:#x}", error);
1142 video->UnlockClock();
1143 DeAllocateCodecsOMX();
1147 // buggy return value
1148 omx_rend_clock_port = p_param.nStartPortNumber;
1152 /* error=OMX_GetHandle(&omx_aud_dec,VPE_OMX_AUDIO_DECODER,NULL,&callbacks);
1154 if (error!=OMX_ErrorNone){
1155 LogNT::getInstance()->debug(TAG, "Init OMX audio decoder failed {:#x}", error);
1156 video->UnlockClock();
1157 DeAllocateCodecsOMX();
1161 error=OMX_GetParameter(omx_aud_dec,OMX_IndexParamAudioInit,&p_param);
1162 if (error!=OMX_ErrorNone){
1163 LogNT::getInstance()->debug(TAG, "Init OMX audio decoder OMX_GetParameter failed {:#x}", error);
1164 video->UnlockClock();
1165 DeAllocateCodecsOMX();
1168 omx_codec_input_port=p_param.nStartPortNumber;
1169 omx_codec_output_port=p_param.nStartPortNumber+1;
1171 if (!video->DisablePort(omx_aud_dec,omx_codec_input_port) || !video->DisablePort(omx_aud_dec,omx_codec_output_port)) {
1172 LogNT::getInstance()->debug(TAG, "Disable Ports OMX audio decoder failed");
1173 video->UnlockClock();
1174 DeAllocateCodecsOMX();
1179 if (!video->DisablePort(omx_aud_rend, omx_rend_input_port, true) )
1181 LogNT::getInstance()->debug(TAG, "Disable Ports OMX audio rend failed {}", omx_rend_input_port);
1182 video->UnlockClock();
1183 DeAllocateCodecsOMX();
1187 if ( !video->DisablePort(omx_aud_rend, omx_rend_clock_port, true))
1189 LogNT::getInstance()->debug(TAG,
1190 "Disable Ports OMX rend clock port failed {}", omx_rend_clock_port);
1191 video->UnlockClock();
1192 DeAllocateCodecsOMX();
1199 error = OMX_SetupTunnel(omx_clock, omx_clock_output_port, omx_aud_rend, omx_rend_clock_port);
1201 if (error != OMX_ErrorNone)
1203 LogNT::getInstance()->debug(TAG, "OMX_Setup tunnel clock to rend failed {:#x} {} {}", error, omx_clock_output_port, omx_rend_clock_port);
1204 video->UnlockClock();
1205 DeAllocateCodecsOMX();
1209 if (!video->EnablePort(omx_clock, omx_clock_output_port, false) || !video->EnablePort(omx_aud_rend, omx_rend_clock_port, false))
1211 LogNT::getInstance()->debug(TAG, "Enable Ports OMX clock rend failed");
1212 video->UnlockClock();
1213 DeAllocateCodecsOMX();
1217 if (!video->ChangeComponentState(omx_aud_rend, OMX_StateIdle))
1219 LogNT::getInstance()->debug(TAG, "aud_rend idle ChangeComponentState");
1220 video->UnlockClock();
1221 DeAllocateCodecsOMX();
1225 if (!video->CommandFinished(omx_aud_rend, OMX_CommandPortEnable, omx_rend_clock_port))
1227 video->UnlockClock();
1228 DeAllocateCodecsOMX();
1232 if (!video->CommandFinished(omx_clock, OMX_CommandPortEnable, omx_clock_output_port))
1234 video->UnlockClock();
1235 DeAllocateCodecsOMX();
1239 if (!ChangeAudioPortConfig(false))
1241 LogNT::getInstance()->info(TAG, "Change AudioPortConfig failed");
1242 video->UnlockClock();
1243 DeAllocateCodecsOMX();
1247 /* if (!video->ChangeComponentState(omx_aud_dec,OMX_StateIdle)) {
1248 LogNT::getInstance()->debug(TAG, "aud_dec ChangeComponentState");
1249 DeAllocateCodecsOMX();
1253 if (!PrepareInputBufsOMX(true))
1255 video->UnlockClock();
1256 DeAllocateCodecsOMX();
1260 /* error=OMX_SetupTunnel(omx_aud_dec,omx_codec_output_port,omx_aud_rend,omx_rend_input_port);
1261 if (error!=OMX_ErrorNone){
1262 LogNT::getInstance()->debug(TAG, "OMX_Setup tunnel dec to render failed {:#x}", error);
1263 video->UnlockClock();
1264 DeAllocateCodecsOMX();
1268 /* if (!video->EnablePort(omx_aud_dec,omx_codec_output_port,false) || !video->EnablePort(omx_aud_rend,omx_rend_input_port,false)
1270 LogNT::getInstance()->debug(TAG, "Enable Ports OMX codec rend failed");
1271 video->UnlockClock();
1272 DeAllocateCodecsOMX();
1276 /* if ( !video->CommandFinished(omx_aud_dec,OMX_CommandPortEnable,omx_codec_output_port)
1277 || !video->CommandFinished(omx_aud_rend,OMX_CommandPortEnable,omx_rend_input_port)) {
1278 video->UnlockClock();
1279 DeAllocateCodecsOMX();
1283 if (!video->ChangeComponentState(omx_aud_rend, OMX_StateExecuting))
1285 LogNT::getInstance()->debug(TAG, "omx_aud_rend ChangeComponentState Execute");
1286 video->UnlockClock();
1287 DeAllocateCodecsOMX();
1291 video->UnlockClock();
1295 video->clockUnpause();
1297 if (!video->setClockExecutingandRunning()) return 0;
1299 LogNT::getInstance()->info(TAG, "Allocate Codecs OMX finished");
1303 int AudioOMX::PrepareInputBufsOMX(bool setportdef) //needs to be called with locvke omx clock mutex
1305 VideoOMX* video = static_cast<VideoOMX*>(Video::getInstance());
1307 OMX_ERRORTYPE error;
1308 OMX_PARAM_PORTDEFINITIONTYPE port_def_type;
1309 memset(&port_def_type, 0, sizeof(port_def_type));
1310 port_def_type.nSize = sizeof(port_def_type);
1311 port_def_type.nVersion.nVersion = OMX_VERSION;
1312 port_def_type.nPortIndex = omx_rend_input_port; //omx_codec_input_port;
1314 error = OMX_GetParameter(omx_aud_rend/*dec*/, OMX_IndexParamPortDefinition, &port_def_type);
1316 if (error != OMX_ErrorNone)
1318 LogNT::getInstance()->debug(TAG, "Get OMX OMX_IndexParamPortDefinition failed {:#x}", error);
1323 port_def_type.nBufferCountActual = 2;
1324 port_def_type.nBufferSize = std::max(toi4(port_def_type.nBufferSize), 50000); // for transcoder important
1326 error = OMX_SetParameter(omx_aud_rend/*dec*/, OMX_IndexParamPortDefinition, &port_def_type);
1327 if (error != OMX_ErrorNone)
1329 LogNT::getInstance()->debug(TAG, "Set OMX OMX_IndexParamPortDefinition failed {:#x}", error);
1333 error = OMX_SendCommand(omx_aud_rend/*dec*/, OMX_CommandPortEnable, omx_rend_input_port/*codec*/, 0);
1334 if (error != OMX_ErrorNone)
1336 LogNT::getInstance()->debug(TAG, "Prepare Input bufs Send Command to enable port {:#x}", error);
1340 input_bufs_omx_mutex.lock();
1342 for (unsigned int i = 0; i < port_def_type.nBufferCountActual; i++)
1344 OMX_BUFFERHEADERTYPE* buf_head = NULL;
1345 error = OMX_AllocateBuffer(omx_aud_rend/*dec*/, &buf_head, omx_rend_input_port/*codec*/, NULL, port_def_type.nBufferSize);
1347 if (error != OMX_ErrorNone)
1349 LogNT::getInstance()->debug(TAG, "Use OMX_AllocateBuffer failed {:#x}", error);
1350 input_bufs_omx_mutex.unlock();
1354 input_bufs_omx_all.push_back(buf_head);
1355 input_bufs_omx_free.push_back(buf_head);
1358 omx_first_frame = true;
1360 firstsynched = false;
1361 cur_input_buf_omx = NULL;
1362 input_bufs_omx_mutex.unlock();
1364 if (!video->CommandFinished(omx_aud_rend/*dec*/, OMX_CommandPortEnable, omx_rend_input_port /*codec*/))
1372 int AudioOMX::DestroyInputBufsOMX() //call with clock mutex locked
1374 OMX_ERRORTYPE error;
1376 cur_input_buf_omx = NULL;
1377 input_bufs_omx_mutex.lock();
1379 for (u4 i = 0; i < input_bufs_omx_all.size(); i++)
1381 error = OMX_FreeBuffer(omx_aud_rend/*dec*/, omx_rend_input_port/*codec*/, input_bufs_omx_all[i]);
1383 if (error != OMX_ErrorNone)
1385 LogNT::getInstance()->debug(TAG, "Use OMX_FreeBuffer failed {:#x}", error);
1386 input_bufs_omx_mutex.unlock();
1391 input_bufs_omx_all.clear();
1392 input_bufs_omx_free.clear();
1393 input_bufs_omx_mutex.unlock();
1398 int AudioOMX::DestroyInputBufsOMXwhilePlaying() //call with clock mutex locked
1400 //OMX_ERRORTYPE error;
1402 cur_input_buf_omx = NULL;
1403 input_bufs_omx_mutex.lock();
1405 while (input_bufs_omx_all.size() > 0)
1407 if (input_bufs_omx_free.size() > 0)
1409 // Destroy one buffer
1410 std::vector<OMX_BUFFERHEADERTYPE*>::iterator itty = input_bufs_omx_all.begin();
1411 OMX_BUFFERHEADERTYPE* cur_buf = input_bufs_omx_free.front();
1413 for (; itty != input_bufs_omx_all.end(); itty++)
1415 if ((*itty) == cur_buf)
1417 input_bufs_omx_all.erase(itty);
1418 input_bufs_omx_free.pop_front();
1425 input_bufs_omx_mutex.unlock();
1427 input_bufs_omx_mutex.lock();
1431 LogNT::getInstance()->debug(TAG, "DestroyInputBufsOMXwhilePlaying {} {}", input_bufs_omx_all.size(), input_bufs_omx_free.size());
1432 input_bufs_omx_mutex.unlock();
1436 int AudioOMX::DeAllocateCodecsOMX()
1438 OMX_ERRORTYPE error;
1439 omx_running = false;
1440 VideoOMX* video = static_cast<VideoOMX*>(Video::getInstance());
1441 LogNT::getInstance()->debug(TAG, "enter deallocatecodecsomx");
1443 LogNT::getInstance()->debug(TAG, "deallocatecodecsomx mark 1");
1445 if (cur_input_buf_omx)
1447 cur_input_buf_omx->nFlags |= OMX_BUFFERFLAG_EOS;
1448 error = video->ProtOMXEmptyThisBuffer(omx_aud_rend/*dec*/, cur_input_buf_omx);
1450 if (error != OMX_ErrorNone)
1452 LogNT::getInstance()->debug(TAG, "OMX_EmptyThisBuffer 6 failed {:#x}", error);
1455 cur_input_buf_omx = NULL; //write out old data
1458 LogNT::getInstance()->debug(TAG, "deallocatecodecsomx mark 2");
1462 if (omx_aud_rend/*dec*/)
1464 // first stop the omx elements
1465 /* if (!video->ChangeComponentState(omx_aud_dec,OMX_StateIdle)) {
1466 LogNT::getInstance()->debug(TAG, "aud_dec ChangeComponentState");
1468 LogNT::getInstance()->debug(TAG, "deallocatecodecsomx mark 3");
1470 video->UnlockClock();
1471 LogNT::getInstance()->debug(TAG, "deallocatecodecsomx mark 4");
1473 LogNT::getInstance()->debug(TAG, "deallocatecodecsomx mark 5");
1476 if (!video->ChangeComponentState(omx_aud_rend, OMX_StateIdle))
1478 LogNT::getInstance()->debug(TAG, "aud_rend ChangeComponentState");
1481 // TODO proper deinit sequence
1482 // first flush all buffers
1484 error = OMX_SendCommand(omx_aud_rend, OMX_CommandFlush, omx_rend_input_port, NULL);
1486 if (error != OMX_ErrorNone)
1488 LogNT::getInstance()->debug(TAG, "OMX_Flush rend in failed {:#x}", error);
1491 /* error=OMX_SendCommand(omx_aud_dec,OMX_CommandFlush, omx_codec_input_port, NULL);
1492 if (error!=OMX_ErrorNone){
1493 LogNT::getInstance()->debug(TAG, "OMX_Flush codec out failed {:#x}", error);
1498 /* if (!video->CommandFinished(omx_aud_dec,OMX_CommandFlush,omx_codec_input_port)) {
1499 LogNT::getInstance()->debug(TAG, "flush cmd codec input failed");
1504 error = OMX_SendCommand(omx_clock, OMX_CommandFlush, omx_clock_output_port, NULL);
1505 if (error != OMX_ErrorNone)
1507 LogNT::getInstance()->debug(TAG, "OMX_Flush clock out failed {:#x}", error);
1510 error = OMX_SendCommand(omx_aud_rend, OMX_CommandFlush, omx_rend_clock_port, NULL);
1511 if (error != OMX_ErrorNone)
1513 LogNT::getInstance()->debug(TAG, "OMX_Flush rend clock failed {:#x}", error);
1516 LogNT::getInstance()->debug(TAG, "deallocatecodecsomx mark 6");
1518 if (!video->CommandFinished(omx_clock, OMX_CommandFlush, omx_clock_output_port) ||
1519 !video->CommandFinished(omx_aud_rend, OMX_CommandFlush, omx_rend_clock_port))
1521 LogNT::getInstance()->debug(TAG, "flush cmd clock shed failed");
1524 DestroyInputBufsOMX(); //We have to make sure that no buffers are in use
1525 LogNT::getInstance()->debug(TAG, "deallocatecodecsomx mark 6a");
1526 DeinitDecoderLibAV();
1527 LogNT::getInstance()->debug(TAG, "deallocatecodecsomx mark 7");
1530 if (!video->DisablePort(omx_aud_rend, omx_rend_input_port, true))
1532 LogNT::getInstance()->debug(TAG, "Disable Tunnel Port failed 1");
1535 /* if (!video->DisablePort(omx_aud_dec,omx_codec_output_port,true)) {
1536 LogNT::getInstance()->debug(TAG, "Disable Tunnel Port failed 6");
1539 if (!video->DisablePort(omx_aud_dec,omx_codec_input_port,true)) {
1540 LogNT::getInstance()->debug(TAG, "Disable Tunnel Port failed 7");
1544 if (!video->DisablePort(omx_aud_rend, omx_rend_clock_port, true))
1546 LogNT::getInstance()->debug(TAG, "Disable Tunnel Port failed 4");
1549 if (!video->DisablePort(omx_clock, omx_clock_output_port, true))
1551 LogNT::getInstance()->debug(TAG, "Disable Tunnel Port failed 5");
1554 /* error=OMX_SetupTunnel(omx_aud_dec,omx_codec_output_port,NULL,NULL);
1555 if (error!=OMX_ErrorNone) {
1556 LogNT::getInstance()->debug(TAG, "OMX_Setup tunnel teardown failed {:#x}", error);
1559 error = OMX_SetupTunnel(omx_aud_rend, omx_rend_input_port, NULL, 0);
1560 if (error != OMX_ErrorNone)
1562 LogNT::getInstance()->debug(TAG, "OMX_Setup tunnel teardown failed {:#x}", error);
1565 error = OMX_SetupTunnel(omx_clock, omx_clock_output_port, NULL, 0);
1566 if (error != OMX_ErrorNone)
1568 LogNT::getInstance()->debug(TAG, "OMX_Setup tunnel teardown failed {:#x}", error);
1571 error = OMX_SetupTunnel(omx_aud_rend, omx_rend_clock_port, NULL, 0);
1572 if (error != OMX_ErrorNone)
1574 LogNT::getInstance()->debug(TAG, "OMX_Setup tunnel teardown failed {:#x}", error);
1577 LogNT::getInstance()->debug(TAG, "deallocatecodecsomx mark 8");
1579 //error=OMX_FreeHandle(omx_aud_dec);
1580 error = OMX_FreeHandle(omx_aud_rend);
1581 video->UnlockClock();
1582 video->destroyClock();
1583 omx_aud_rend/*dec*/ = NULL;
1585 if (error != OMX_ErrorNone)
1587 LogNT::getInstance()->debug(TAG, "FreeHandle failed {}", error);
1592 video->UnlockClock();
1593 DeinitDecoderLibAV();
1596 LogNT::getInstance()->debug(TAG, "leave deallocate codecs OMX");
1600 int AudioOMX::stop()
1602 if (!initted) return 0;
1604 LogNT::getInstance()->debug(TAG, "Audio stop called");
1605 DeAllocateCodecsOMX();
1606 //if (ioctl(fdAudio, AV_SET_AUD_RESET, 0x11) != 0) return 0;
1610 int AudioOMX::mute()
1612 if (!initted) return 0;
1614 LogNT::getInstance()->debug(TAG, "MUTE MUTE MUTE");
1615 VideoOMX* vw = static_cast<VideoOMX*>(Video::getInstance());
1620 OMX_AUDIO_CONFIG_MUTETYPE amute;
1621 memset(&amute, 0, sizeof(amute));
1622 amute.nSize = sizeof(amute);
1623 amute.nVersion.nVersion = OMX_VERSION;
1624 amute.nPortIndex = omx_rend_input_port;
1625 amute.bMute = OMX_TRUE;
1626 OMX_ERRORTYPE error = OMX_SetParameter(omx_aud_rend, OMX_IndexConfigAudioMute, &amute);
1628 if (error != OMX_ErrorNone)
1630 LogNT::getInstance()->debug(TAG,
1631 "Set OMX_IndexConfigAudioMute failed {:#x} {}", error, omx_rend_input_port);
1643 int AudioOMX::unMute()
1645 if (!initted) return 0;
1647 LogNT::getInstance()->debug(TAG, "MUTE OFF OFF OFF");
1648 VideoOMX* vw = static_cast<VideoOMX*>(Video::getInstance());
1653 OMX_AUDIO_CONFIG_MUTETYPE amute;
1654 memset(&amute, 0, sizeof(amute));
1655 amute.nSize = sizeof(amute);
1656 amute.nVersion.nVersion = OMX_VERSION;
1657 amute.nPortIndex = omx_rend_input_port;
1658 amute.bMute = OMX_FALSE;
1659 OMX_ERRORTYPE error = OMX_SetParameter(omx_aud_rend, OMX_IndexConfigAudioMute, &amute);
1661 if (error != OMX_ErrorNone)
1663 LogNT::getInstance()->debug(TAG, "Set OMX_IndexConfigAudioMute failed {:#x} {}", error, omx_rend_input_port);
1675 int AudioOMX::pause()
1677 if (!initted) return 0;
1679 VideoOMX* vw = static_cast<VideoOMX*>(Video::getInstance());
1684 int AudioOMX::unPause()
1686 if (!initted) return 0;
1688 VideoOMX* vw = static_cast<VideoOMX*>(Video::getInstance());
1693 int AudioOMX::reset()
1695 if (!initted) return 0;
1698 LogNT::getInstance()->debug(TAG, "reset called");
1699 DeAllocateCodecsOMX();
1701 // if (ioctl(fdAudio, AV_SET_AUD_RESET, 0x11) != 0) return 0;
1702 // LogNT::getInstance()->debug(TAG, "reset back");
1703 // if (ioctl(fdAudio, AV_SET_AUD_PLAY, 0) != 0) return 0;
1709 int AudioOMX::setVolume(int tvolume)
1711 // parameter: 0 for silence, 20 for full
1712 if ((tvolume < 0) || (tvolume > 20)) return 0;
1714 // volume = 2 * (20 - volume);
1715 // Right, that one was rubbish... 0-10 were almost
1716 // inaudible, 11-20 did what should have been done
1717 // over the whole 0-20 range
1720 VideoOMX* vw = static_cast<VideoOMX*>(Video::getInstance());
1726 OMX_AUDIO_CONFIG_VOLUMETYPE avol;
1727 memset(&avol, 0, sizeof(avol));
1728 avol.nSize = sizeof(avol);
1729 avol.nVersion.nVersion = OMX_VERSION;
1730 avol.nPortIndex = omx_rend_input_port;
1731 avol.bLinear = OMX_FALSE;
1732 avol.sVolume.nValue = (volume - 20) * 200;
1733 OMX_ERRORTYPE error = OMX_SetParameter(omx_aud_rend, OMX_IndexConfigAudioVolume, &avol);
1735 if (error != OMX_ErrorNone)
1737 LogNT::getInstance()->debug(TAG, "Set OMX_IndexConfigAudioVolume failed {:#x} {}", error, omx_rend_input_port);
1749 int AudioOMX::test()
1752 // return ioctl(fdAudio, AV_SET_AUD_STC, &stc);
1754 /* aud_sync_parms_t a;
1758 // int b = ioctl(fdAudio, AV_SET_AUD_DISABLE_SYNC, &a);
1761 /*OK*/ //printf("Audio sync disable = %i\n", b);
1767 unsigned int AudioOMX::AdvanceMpAudioSync(const u1* data, unsigned int size, unsigned int* framesize)
1769 if (size <= 2) return size; // silly;
1771 unsigned int atest = 0;
1774 //inspired by libav parsing code
1775 while (atest + 1 < size)
1777 if (data[atest] == 0xFF && (data[atest + 1] & 0xe0) == 0xe0)
1779 if ((data[atest + 1] & 0x18) == 0x08) {atest++; continue;} //sanity check: mpeg version ID 01 -> reserved
1781 //sanity check inspired by libav
1784 const int sample_rates[4] = {44100, 48000, 32000, 0};
1785 const short bitrate_tab[2][3][15] = { { {
1786 0, 32, 64, 96, 128, 160,
1787 192, 224, 256, 288, 320, 352, 384, 416, 448
1790 56, 64, 80, 96, 112, 128, 160, 192, 224, 256, 320, 384
1792 0, 32, 40, 48, 56, 64, 80, 96, 112, 128, 160, 192, 224,
1796 0, 32, 48, 56, 64, 80, 96, 112, 128, 144,
1797 160, 176, 192, 224, 256
1799 0, 8, 16, 24, 32, 40, 48, 56,
1800 64, 80, 96, 112, 128, 144, 160
1802 0, 8, 16, 24, 32, 40,
1803 48, 56, 64, 80, 96, 112, 128, 144, 160
1809 int layer = 4 - ((data[atest + 1] & 0x06) >> 1);
1811 if (layer == 4) {atest++; continue;} //sanity check
1813 int bitrate_index = (data[atest + 2] & 0xf0) >> 4;
1815 if (bitrate_index == 0x0f || bitrate_index == 0x0) {atest++; continue;} //sanity check
1817 int samplerate_index = (data[atest + 2] & 0x0C) >> 2;
1819 if (samplerate_index == 0x03) {atest++; continue;} //sanity check
1821 int padding = (data[atest + 2] & 2) >> 1;
1823 if (0x10 & data[atest + 1])
1825 lsf = ((data[atest + 1]) & 0x8) ? 0 : 1;
1834 int sample_rate = sample_rates[ samplerate_index] >> (lsf + mpeg2);
1836 int temp_frame_size = bitrate_tab[lsf][layer - 1][bitrate_index];
1840 frame_size = (temp_frame_size * 12000) / sample_rate;
1841 frame_size = (frame_size + padding) * 4;
1843 else if (layer == 2)
1845 frame_size = (temp_frame_size * 144000) / sample_rate;
1846 frame_size = frame_size + padding;
1850 frame_size = (temp_frame_size * 144000) / (sample_rate << lsf);
1851 frame_size = frame_size + padding;
1854 unsigned int sameheadertest = (data[atest] << 24) | (data[atest + 1] << 16) | (data[atest + 2] << 8);
1855 const unsigned mask = (0xffe00000 | (3 << 17) | (3 << 10) | (3 << 19)); // from libav
1859 mp3sameheader = sameheadertest;
1860 mp3sameheadercount = 2;
1863 if ((mp3sameheader & mask) == (sameheadertest & mask)) mp3sameheadercount++;
1864 else mp3sameheadercount = 0;
1866 mp3sameheader = sameheadertest;
1868 //LogNT::getInstance()->debug(TAG, "FRAME: {} {} {} {} {} {} {}",lsf,layer,bitrate_index,sample_rate,padding,temp_frame_size, frame_size);
1869 //LogNT::getInstance()->debug(TAG, "FRAME DIAG: {:#x} {:#x} {:#x} {}",data[atest],data[atest+1],data[atest+2],mp3sameheadercount);
1871 if (mp3sameheadercount > 4)
1873 *framesize = frame_size;
1874 return atest; // probably FrameSync
1875 } //skip it if the header changes too frequently
1884 unsigned int AudioOMX::AdvanceAc3AudioSync(const u1* data, unsigned int size, unsigned int* framesize)
1886 if (size <= 4) return size; // silly;
1888 const int frm_size_tab[] = { 64, 64, 80, 80, 96, 96, 112, 112, 128, 128,
1889 160, 160, 192, 192, 224, 224, 256, 256, 320, 320, 384, 384, 448,
1890 448, 512, 512, 640, 640, 768, 768, 896, 896, 1024, 1024, 1152,
1893 unsigned int atest = 0;
1894 *framesize = 20000; //if we do not find a start code do not decompress
1896 while (atest + 4 < size)
1898 if (data[atest] == 0x0B && data[atest + 1] == 0x77)
1900 // now figure out the length of the frame
1901 unsigned char code = data[atest + 4];
1902 unsigned char fscod = (code & 0xC0) >> 6;
1903 unsigned char frmsize = (code & 0x3f);
1905 if (fscod != 0) LogNT::getInstance()->debug(TAG, "warning we only support 48 KHz sampling rate");
1907 *framesize = frm_size_tab[frmsize] * 2;
1908 return atest; // probably FrameSync
1917 unsigned int AudioOMX::AdvanceAacLatmAudioSync(const u1* data, unsigned int size, unsigned int* framesize)
1919 if (size <= 4) return size; // silly;
1921 unsigned int atest = 0;
1922 *framesize = 20000; //if we do not find a start code do not decompress
1924 while (atest + 4 < size)
1926 if (data[atest] == 0x56 && (data[atest + 1] & 0xe0) == 0xe0)
1928 // now figure out the length of the frame
1929 unsigned int length = ((0x1f & data[atest + 1]) << 8) | data[atest + 2];
1930 *framesize = length + 3;
1931 return atest; // probably FrameSync
1941 void AudioOMX::PrepareMediaSample(const MediaPacketList& mplist, u4 /* samplepos */)
1943 packet = mplist.front();
1946 u4 AudioOMX::DeliverMediaSample(u1* buffer, u4* samplepos)
1948 DeliverMediaPacket(packet, buffer, samplepos);
1950 if (*samplepos == packet.length)
1959 long long AudioOMX::correctAudioLatency(long long pts, int addsamples, int srate)
1961 VideoOMX* video = static_cast<VideoOMX*>(Video::getInstance());
1963 OMX_PARAM_U32TYPE audio_lat;
1964 OMX_ERRORTYPE error;
1965 memset(&audio_lat, 0, sizeof(audio_lat));
1966 audio_lat.nSize = sizeof(audio_lat);
1967 audio_lat.nVersion.nVersion = OMX_VERSION;
1968 audio_lat.nPortIndex = omx_rend_input_port;
1970 error = OMX_GetConfig(omx_aud_rend, OMX_IndexConfigAudioRenderingLatency,
1972 video->UnlockClock();
1974 if (error != OMX_ErrorNone)
1976 LogNT::getInstance()->debug(TAG, "Init OMX_IndexConfigAudioRenderingLatencyfailed {:#x} {}", error, omx_rend_input_port);
1977 return pts; // no correction in case of error
1980 /*LogNT::getInstance()->debug(TAG, "Current audio latency {}",
1983 long long workpts = 0;
1984 workpts += addsamples;
1985 workpts -= audio_lat.nU32;
1986 workpts *= 10LL * 1000LL * 1000LL;
1987 workpts = workpts / ((long long)srate); //one second /samplerate
1993 bool AudioOMX::DrainTargetBufferFull()
1995 //Check, if we have OMX output buffers
1997 input_bufs_omx_mutex.lock();
1998 full = (input_bufs_omx_free.size() == 0);
1999 input_bufs_omx_mutex.unlock();
2003 u4 AudioOMX::DeliverMediaPacket(MediaPacket mpacket, const u1* buffer, u4* samplepos)
2005 /*First Check, if we have an audio sample*/
2006 VideoOMX* vw = static_cast<VideoOMX*>(Video::getInstance());
2007 bool achange = false;
2008 OMX_ERRORTYPE error;
2010 //Log *logger=Log::getInstance();
2011 if (vw->InIframemode())
2015 return 0; //Not in iframe mode!
2018 if (!omx_running) return 0; // if we are not runnig do not do this
2020 if (vw->isClockPaused()) return 0; //Block if we pause
2022 //LogNT::getInstance()->debug(TAG, "DMP mark 1");
2024 //LogNT::getInstance()->debug(TAG, "DeliverMediaPacketOMX time {}",mpacket.presentation_time);
2026 /* if (mpacket.synched && mpacket.presentation_time <= 0) {
2027 *samplepos = mpacket.length;
2028 firstsynched = false;
2030 LogNT::getInstance()->debug(TAG,
2031 "DeliverMediaPacketOMX Frameskip");
2032 return mpacket.length;
2035 //LogNT::getInstance()->debug(TAG, "DMP mark 2");
2039 if (mpacket.disconti)
2041 firstsynched = false;
2042 decompress_buffer_filled = 0;
2044 if (cur_input_buf_omx)
2046 error = vw->ProtOMXEmptyThisBuffer(omx_aud_rend/*dec*/, cur_input_buf_omx);
2048 if (error != OMX_ErrorNone)
2050 LogNT::getInstance()->debug(TAG, "OMX_EmptyThisBuffer 1 failed {:#x}", error);
2053 cur_input_buf_omx = NULL;
2059 //LogNT::getInstance()->debug(TAG, "DMP mark 3");
2060 if (mpacket.type != lastAType) //Format Change //Push data out !
2062 firstsynched = false;
2065 LogNT::getInstance()->debug(TAG, "Notice audio type change {} {}", mpacket.type, lastAType);
2066 lastAType = mpacket.type;
2067 decompress_buffer_filled = 0;
2069 if (cur_input_buf_omx)
2071 error = vw->ProtOMXEmptyThisBuffer(omx_aud_rend/*dec*/,
2074 if (error != OMX_ErrorNone)
2076 LogNT::getInstance()->debug(TAG, "OMX_EmptyThisBuffer 2 failed {:#x}", error);
2079 cur_input_buf_omx = NULL;
2084 pthread_setcancelstate(PTHREAD_CANCEL_DISABLE, &oldcancelstate);
2085 pthread_setcanceltype(PTHREAD_CANCEL_DEFERRED, &oldcanceltype);
2088 if (!ChangeAudioPortConfig(true))
2090 LogNT::getInstance()->debug(TAG, "Changing audio port config failed", error);
2094 pthread_setcancelstate(oldcancelstate, NULL);
2095 pthread_setcanceltype(oldcanceltype, NULL);
2099 //LogNT::getInstance()->debug(TAG, "DMP mark 4");
2101 /*Inspect PES-Header */
2102 if (*samplepos == 0 && mpacket.type != MPTYPE_MPEG_AUDIO_LAYER3) //stripheader
2104 headerstrip = buffer[mpacket.pos_buffer + 8] + 9;
2106 if (mpacket.type == MPTYPE_AC3)
2107 headerstrip += 4; //skip ac3 bytes
2109 *samplepos += headerstrip;
2111 if (mpacket.synched)
2113 if (cur_input_buf_omx)
2115 //cur_input_buf_omx->nFlags |= OMX_BUFFERFLAG_ENDOFFRAME;
2116 error = vw->ProtOMXEmptyThisBuffer(omx_aud_rend/*dec*/, cur_input_buf_omx);
2118 if (error != OMX_ErrorNone)
2120 LogNT::getInstance()->debug(TAG, "OMX_EmptyThisBuffer 3 failed {:#x}", error);
2123 //vw->AdjustAudioPTS(correctAudioLatency(lastreftimeOMX,cur_input_buf_omx->nFilledLen/(2*2),48000));
2125 cur_input_buf_omx = NULL;//write out old data
2128 firstsynched = true;
2129 //decompress_buffer_filled=0;
2133 if (!firstsynched) //
2135 *samplepos = mpacket.length;//if we have not processed at least one
2136 decompress_buffer_filled = 0;
2137 //LogNT::getInstance()->debug(TAG, "DMP mark 5");
2138 return mpacket.length;//synched packet ignore it!
2143 if (!cur_input_buf_omx)
2145 input_bufs_omx_mutex.lock();
2147 if (input_bufs_omx_free.size() == 0)
2149 input_bufs_omx_mutex.unlock();
2150 //LogNT::getInstance()->debug(TAG, "DMP mark 6");
2151 //LogNT::getInstance()->debug(TAG, "Deliver MediaPacket no free sample");
2152 return 0; // we do not have a free media sample
2155 cur_input_buf_omx = input_bufs_omx_free.front();
2156 cur_input_buf_omx->nFilledLen = 0;
2157 cur_input_buf_omx->nOffset = 0;
2158 cur_input_buf_omx->nTimeStamp = VideoOMX::intToOMXTicks(0);
2159 input_bufs_omx_free.pop_front();
2160 input_bufs_omx_mutex.unlock();
2163 //LogNT::getInstance()->debug(TAG, "DMP mark 7");
2165 if (cur_input_buf_omx->nFilledLen == 0) //will only be changed on first packet
2167 if (mpacket.synched)
2169 //LogNT::getInstance()->debug(TAG,
2170 // "packet synched marker");
2172 //lastreftimePTS=mpacket.pts;
2173 if (omx_first_frame) // TODO time
2175 cur_input_buf_omx->nFlags = OMX_BUFFERFLAG_STARTTIME;
2176 LogNT::getInstance()->debug(TAG, "Starttime");
2177 omx_first_frame = false;
2181 cur_input_buf_omx->nFlags = 0;
2182 //cur_input_buf_omx->nFlags|=OMX_BUFFERFLAG_TIME_UNKNOWN;
2185 lastreftimeOMX = mpacket.presentation_time;
2186 //LogNT::getInstance()->debug(TAG,
2187 // "Time code {} pts {} dts {}", lastreftimeOMX, mpacket.pts,mpacket.dts);
2188 lastreftimePTS = mpacket.pts;
2189 cur_input_buf_omx->nTimeStamp = VideoOMX::intToOMXTicks(lastreftimeOMX / 10LL); // the clock component is faulty;
2193 // LogNT::getInstance()->debug(TAG,
2194 // "packet NOT synched marker");
2195 cur_input_buf_omx->nFlags = OMX_BUFFERFLAG_TIME_UNKNOWN;
2196 cur_input_buf_omx->nTimeStamp = VideoOMX::intToOMXTicks(0);
2199 if (mpacket.disconti || achange)
2201 cur_input_buf_omx->nFlags |= OMX_BUFFERFLAG_DISCONTINUITY;
2202 //mp23codec_context_libav->frame_size=-1;
2203 //ac3codec_context_libav->frame_size=-1;
2207 //LogNT::getInstance()->debug(TAG, "DMP mark 8");
2209 if (*samplepos > mpacket.length) *samplepos = 0; //propably the thread got interrupted and sample is not valid any more!
2211 unsigned int haveToCopy = mpacket.length - *samplepos;
2215 while (haveToCopy > 0)
2217 //LogNT::getInstance()->debug(TAG, "DMP mark 9");
2220 unsigned int gotframesize = 0;
2223 switch (mpacket.type)
2225 case MPTYPE_MPEG_AUDIO:
2226 case MPTYPE_MPEG_AUDIO_LAYER3:
2228 adv = AdvanceMpAudioSync(buffer + mpacket.pos_buffer + *samplepos, haveToCopy, &gotframesize);
2233 case MPTYPE_AC3_PRE13:
2235 adv = AdvanceAc3AudioSync(buffer + mpacket.pos_buffer + *samplepos, haveToCopy, &gotframesize);
2239 case MPTYPE_AAC_LATM:
2241 adv = AdvanceAacLatmAudioSync(buffer + mpacket.pos_buffer + *samplepos, haveToCopy, &gotframesize);
2246 if (adv != (int)haveToCopy)
2254 *samplepos = mpacket.length; //no ac3 sync byte
2255 //LogNT::getInstance()->debug(TAG, "DMP mark 10");
2256 return mpacket.length;
2260 // so everything is fine now do a memcpy
2261 int cancopy = std::min(haveToCopy, cur_input_buf_omx->nAllocLen - cur_input_buf_omx->nFilledLen);
2262 memcpy(cur_input_buf_omx->pBuffer + cur_input_buf_omx->nFilledLen, buffer + mpacket.pos_buffer + *samplepos, cancopy);
2263 haveToCopy -= cancopy;
2264 cur_input_buf_omx->nFilledLen += cancopy;
2265 *samplepos += cancopy;
2266 //LogNT::getInstance()->debug(TAG, "DMP mark 11");
2268 error = vw->ProtOMXEmptyThisBuffer(omx_aud_rend/*dec*/, cur_input_buf_omx);
2270 if (error != OMX_ErrorNone)
2272 LogNT::getInstance()->debug(TAG, "OMX_EmptyThisBuffer 5 failed {:#x}", error);
2275 cur_input_buf_omx = NULL;
2280 input_bufs_omx_mutex.lock();
2282 if (input_bufs_omx_free.size() == 0)
2284 input_bufs_omx_mutex.unlock();
2285 // LogNT::getInstance()->debug(TAG, "Deliver MediaPacket no free sample2");
2286 return *samplepos; // we do not have a free media sample
2289 cur_input_buf_omx = input_bufs_omx_free.front();
2290 cur_input_buf_omx->nFilledLen = 0;
2291 cur_input_buf_omx->nOffset = 0;
2292 cur_input_buf_omx->nFlags = OMX_BUFFERFLAG_TIME_UNKNOWN;
2293 cur_input_buf_omx->nTimeStamp = VideoOMX::intToOMXTicks(0);
2294 input_bufs_omx_free.pop_front();
2295 input_bufs_omx_mutex.unlock();
2298 //LogNT::getInstance()->debug(TAG, "DMP mark 12");
2302 //LogNT::getInstance()->debug(TAG, "DMP mark 13");
2312 AVCodecContext* current_context;
2314 switch (mpacket.type)
2316 case MPTYPE_MPEG_AUDIO:
2317 case MPTYPE_MPEG_AUDIO_LAYER3:
2319 current_context = mp23codec_context_libav;
2321 if (current_context->frame_size < 0) framesize = 1152; //Maximum framesize
2322 else framesize = current_context->frame_size;
2325 case MPTYPE_AAC_LATM:
2327 current_context = aaclatmcodec_context_libav;
2331 case MPTYPE_AC3_PRE13:
2333 current_context = ac3codec_context_libav;
2337 if (decompress_buffer_filled) // have a remaining paket
2339 incoming_paket_libav.data = (uint8_t*) decompress_buffer;
2340 memcpy(decompress_buffer + decompress_buffer_filled,
2341 buffer + mpacket.pos_buffer + *samplepos,
2342 std::min(haveToCopy, decompress_buffer_size - decompress_buffer_filled));
2343 incoming_paket_libav.size = decompress_buffer_filled
2344 + std::min(haveToCopy, decompress_buffer_size - decompress_buffer_filled);
2345 //LogNT::getInstance()->debug(TAG,"Use saved audio buffer {} {} {}",mpacket.type,decompress_buffer_filled,mpacket.synched);
2349 incoming_paket_libav.data = (uint8_t*) buffer + mpacket.pos_buffer + *samplepos;
2350 incoming_paket_libav.size = haveToCopy;
2353 //LogNT::getInstance()->debug(TAG, "DMP mark 18");
2355 while (haveToCopy > 0 && errcount < 3)
2357 //LogNT::getInstance()->debug(TAG,"libav in {} {}",framesize,current_context->frame_size);
2358 //LogNT::getInstance()->debug(TAG, "libav in {} {}",
2359 // framesize, current_context->frame_size);
2361 bool donotdecompress = false;
2362 unsigned int gotframesize = 0;
2363 // if (!decompress_buffer_filled) { // only do this if no old data is present
2366 switch (mpacket.type)
2368 case MPTYPE_MPEG_AUDIO:
2369 case MPTYPE_MPEG_AUDIO_LAYER3:
2371 adv = AdvanceMpAudioSync(incoming_paket_libav.data,
2372 incoming_paket_libav.size, &gotframesize);
2377 case MPTYPE_AC3_PRE13:
2379 adv = AdvanceAc3AudioSync(incoming_paket_libav.data,
2380 incoming_paket_libav.size, &gotframesize);
2384 case MPTYPE_AAC_LATM:
2386 adv = AdvanceAacLatmAudioSync(incoming_paket_libav.data,
2387 incoming_paket_libav.size, &gotframesize);
2392 if (adv > 0 /*&& !decompress_buffer_filled*/)
2394 incoming_paket_libav.data += adv;
2395 incoming_paket_libav.size -= adv;
2398 /*if (current_context->frame_size>0) framesize=min(current_context->frame_size,haveToCopy);
2399 else*/ framesize = haveToCopy;
2401 //LogNT::getInstance()->debug(TAG,"Advance by {} {} from {}",adv,mpacket.type,*samplepos );
2402 if (haveToCopy <= 0)
2404 // LogNT::getInstance()->debug(TAG,"No sync code in packet remove {}",mpacket.type);
2405 *samplepos = mpacket.length;
2406 return mpacket.length;
2411 if (gotframesize > 0 && gotframesize > haveToCopy)
2413 donotdecompress = true;
2414 errcount = 100; // exit loop
2417 // else LogNT::getInstance()->debug(TAG,"Loop run");
2420 //LogNT::getInstance()->debug(TAG, "DMP mark 19");
2421 if (!donotdecompress)
2425 pthread_testcancel();
2426 pthread_setcancelstate(PTHREAD_CANCEL_DISABLE, &oldcancelstate);
2427 pthread_setcanceltype(PTHREAD_CANCEL_DEFERRED, &oldcanceltype);
2430 if (!omx_running || !mp23codec_context_libav
2431 || !ac3codec_context_libav)
2433 libav_mutex.unlock();
2437 libav_mutex.unlock();
2438 // LogNT::getInstance()->debug(TAG,"libav out");
2439 int save_size = incoming_paket_libav.size;
2441 if ((int)gotframesize <= incoming_paket_libav.size)
2443 if (gotframesize > 0) incoming_paket_libav.size = gotframesize;
2446 // avcodec_decode_audio4 is deprecated
2447 // DO_NOT_USE() works, but assumes all decoded data is returned
2448 // in the first call to avcodec_receive_frame which is
2449 // definitely bad code.
2450 // This all needs reworking to handle this properly.
2451 // Leaving DO_NOT_USE in the code in case we have to switch to it
2452 len = avcodec_decode_audio4(current_context, decode_frame_libav,
2453 &gotta, &incoming_paket_libav);
2455 //len = DO_NOT_USE(current_context, decode_frame_libav,
2456 // &gotta, &incoming_paket_libav);
2461 //LogNT::getInstance()->debug(TAG, "FRAME:E {} {}",gotframesize,incoming_paket_libav.size);
2466 //LogNT::getInstance()->debug(TAG, "FRAME:T {}",len);
2467 incoming_paket_libav.size = save_size;
2468 //LogNT::getInstance()->debug(TAG, "libav out1");
2469 pthread_setcancelstate(oldcancelstate, NULL);
2470 pthread_setcanceltype(oldcanceltype, NULL);
2471 pthread_testcancel();
2480 //LogNT::getInstance()->debug(TAG, "libav out2");
2481 //LogNT::getInstance()->debug(TAG, "DMP mark 20");
2484 libav_mutex.unlock();
2488 if (decompress_buffer_filled) // reset to normal decoding
2495 // decompress_buffer_filled is unsigned int
2496 // so if decompress_buffer_filled > len, len can go negative.
2498 // Why would you use a min function with one of the values hard coded to zero?
2499 // If param1 is positive the result is always 0.
2500 // If param1 is negative the result is always param1.
2501 // However, badMinimumFunction is and always was: int badMinimumFunction(u4 a, int b)
2502 // .. which takes param1 as unsigned. So whatever param1 is, the result is always 0.
2504 // A guess is that the intention was to try to calculate a positive result, but if
2505 // for some reason len-decompress_buffer_filled < 0, return 0.
2506 // But for that you would use a max() function...
2508 //haveToCopy -= badMinimumFunction(len - decompress_buffer_filled, 0);
2509 //*samplepos += badMinimumFunction(len - decompress_buffer_filled, 0);
2511 int result = badMinimumFunction(len - decompress_buffer_filled, 0);
2512 haveToCopy -= result;
2513 *samplepos += result;
2515 abort(); // When does this run?
2518 // len is always either 0 or the result of avcodec_decode_audio4(current_context, decode_frame_libav, &gotta, &incoming_paket_libav);
2519 // the result of avcodec_decode_audio4 can be negative in case of error, but that is filtered out above
2521 // decompress_buffer_filled appears to be how much of the decompress buffer has already been written to.
2522 // Presumably things can happen in multiple chunks.
2525 //if (current_context->frame_size>0) framesize=min(current_context->frame_size,haveToCopy);
2526 /*else*/ framesize = haveToCopy;
2530 framesize = haveToCopy;
2533 incoming_paket_libav.data = (uint8_t*) buffer + mpacket.pos_buffer + *samplepos;
2535 decompress_buffer_filled = 0;
2541 incoming_paket_libav.data += len;
2545 /*if (current_context->frame_size>0) framesize=min(current_context->frame_size,haveToCopy);
2546 else*/framesize = haveToCopy;
2551 framesize = haveToCopy;
2555 //LogNT::getInstance()->debug(TAG, "DMP mark 21");
2557 incoming_paket_libav.size = framesize;
2561 //LogNT::getInstance()->debug(TAG,
2564 int dsize = av_samples_get_buffer_size(NULL,
2565 /*current_context->channels*/2, decode_frame_libav->nb_samples,
2566 AV_SAMPLE_FMT_S16, 1);
2568 /* int dsize_in = av_samples_get_buffer_size(NULL,
2569 current_context->channels, decode_frame_libav->nb_samples,
2570 current_context->sample_fmt, 1); -- unused */
2571 //if (current_context->channels==1) dsize*=2; // we convert mono to stereo
2572 if ((cur_input_buf_omx->nFilledLen + dsize) > cur_input_buf_omx->nAllocLen)
2574 // I doubt that this will ever happen
2575 // LogNT::getInstance()->debug(TAG,
2576 // "P 2 Time code {} pts {}", lastreftimeOMX, mpacket.pts);
2577 error = vw->ProtOMXEmptyThisBuffer(omx_aud_rend/*dec*/, cur_input_buf_omx);
2578 if (error != OMX_ErrorNone)
2580 LogNT::getInstance()->debug(TAG, "OMX_EmptyThisBuffer 4 failed {:#x}", error);
2583 cur_input_buf_omx = NULL;
2585 if (!cur_input_buf_omx)
2589 while (count < 10 && omx_running)
2592 input_bufs_omx_mutex.lock();
2594 if (input_bufs_omx_free.size() == 0)
2596 input_bufs_omx_mutex.unlock();
2597 // LogNT::getInstance()->debug(TAG,
2598 // "Deliver MediaPacket no free sample");
2601 //LogNT::getInstance()->debug(TAG, "DMP mark22");
2602 if (!omx_running) return *samplepos;
2604 //LogNT::getInstance()->debug(TAG, "DMP mark 23");
2608 cur_input_buf_omx = input_bufs_omx_free.front();
2609 cur_input_buf_omx->nFilledLen = 0;
2610 cur_input_buf_omx->nOffset = 0;
2611 cur_input_buf_omx->nTimeStamp = VideoOMX::intToOMXTicks(0);
2612 cur_input_buf_omx->nFlags = OMX_BUFFERFLAG_TIME_UNKNOWN;
2613 input_bufs_omx_free.pop_front();
2614 input_bufs_omx_mutex.unlock();
2618 if (!cur_input_buf_omx) return *samplepos;
2622 //LogNT::getInstance()->debug(TAG,"memcpy in {} {} {}" ,dsize,current_context->sample_rate,cur_input_buf_omx->nFilledLen);
2625 av_opt_set_int(resam_con_libav, "in_sample_rate", decode_frame_libav->sample_rate, 0);
2626 av_opt_set_int(resam_con_libav, "in_sample_fmt", decode_frame_libav->format, 0);
2627 av_opt_set_int(resam_con_libav, "in_channel_layout", decode_frame_libav->channel_layout, 0);
2628 //LogNT::getInstance()->error(TAG, "AV resampledata {} {} {} {}",current_context->channels,current_context->sample_rate,current_context->sample_fmt,current_context->channel_layout);
2629 //LogNT::getInstance()->error(TAG, "AV resampledata2 {} {} {}",decode_frame_libav->sample_rate,decode_frame_libav->format,decode_frame_libav->channel_layout);
2631 int ret = swr_init(resam_con_libav);
2635 LogNT::getInstance()->error(TAG, "Opening AV resample failed {}", ret);
2639 uint8_t* output = cur_input_buf_omx->pBuffer + cur_input_buf_omx->nFilledLen;
2642 avresample_convert ( AVAudioResampleContext * avr,
2646 uint8_t *const * input,
2652 avresample_convert(resam_con_libav,
2653 &output, dsize, decode_frame_libav->nb_samples,
2654 decode_frame_libav->extended_data, decode_frame_libav->linesize[0], decode_frame_libav->nb_samples);
2657 swr_convert ( struct SwrContext * s,
2660 const uint8_t ** in,
2665 //LogNT::getInstance()->debug(TAG, "Calling swr_convert");
2667 swr_convert(resam_con_libav, &output, decode_frame_libav->nb_samples, (const uint8_t**)decode_frame_libav->extended_data, decode_frame_libav->nb_samples);
2669 swr_close(resam_con_libav);
2672 //LogNT::getInstance()->debug(TAG,"memcpy out");
2673 cur_input_buf_omx->nFilledLen += dsize;
2677 //LogNT::getInstance()->debug(TAG,"Incomplete mpeg frames in pes packet {} {}",incoming_paket_libav.size,mpacket.length);
2678 /* uint8_t a1=incoming_paket_libav.data[0];
2679 uint8_t a2=incoming_paket_libav.data[1];
2680 uint8_t a3=incoming_paket_libav.data[2];
2681 uint8_t a4=incoming_paket_libav.data[3];*/
2682 // LogNT::getInstance()->debug(TAG,"Header {:#x} {:#x} {:#x} {:#x}",a1,a2,
2688 //LogNT::getInstance()->debug(TAG, "DMP mark 24");
2689 decompress_buffer_filled = 0;
2693 //LogNT::getInstance()->debug(TAG,"We can not decompress {} save for later {} {:#x} {:#x}",haveToCopy,mpacket.type,incoming_paket_libav.data,mpacket.pos_buffer);
2694 memcpy(decompress_buffer, incoming_paket_libav.data, std::min(haveToCopy, decompress_buffer_size));
2695 decompress_buffer_filled = std::min(haveToCopy, decompress_buffer_size);
2698 if (cur_input_buf_omx->nFilledLen)
2700 //LogNT::getInstance()->debug(TAG,
2701 // "P 3 Time code {} pts {}", lastreftimeOMX, mpacket.pts);
2702 error = vw->ProtOMXEmptyThisBuffer(omx_aud_rend/*dec*/, cur_input_buf_omx);
2704 if (error != OMX_ErrorNone)
2706 LogNT::getInstance()->debug(TAG, "OMX_EmptyThisBuffer 5 failed {:#x}", error);
2709 //if (mpacket.synched) vw->AdjustAudioPTS(correctAudioLatency(lastreftimeOMX,cur_input_buf_omx->nFilledLen/(2*2),48000));
2710 cur_input_buf_omx = NULL;
2714 //LogNT::getInstance()->debug(TAG, "DMP mark 25");
2716 *samplepos = mpacket.length;
2717 return mpacket.length;
2720 long long AudioOMX::SetStartOffset(long long curreftime, bool* rsync)
2722 VideoOMX* vw = dynamic_cast<VideoOMX*>(Video::getInstance());
2723 return vw->SetStartAudioOffset(curreftime, rsync);
2726 void AudioOMX::ResetTimeOffsets()
2728 VideoOMX* vw = dynamic_cast<VideoOMX*>(Video::getInstance());
2729 vw->ResetTimeOffsets();
2733 int AudioOMX::badMinimumFunction(u4 a, int b)
2735 printf("MIN: P1: %u, P2: %i\n", a, b);
2737 if (a > b) return b;
2741 int AudioOMX::DO_NOT_USE(AVCodecContext* avctx, // used - sent to avcodec_send_packet
2742 AVFrame* frame, // used - object for receive to write to
2743 int* got_frame_ptr, // out param
2744 const AVPacket* avpkt) // used - sent to avcodec_send_packet
2746 // Set this to error here. Any error point returns -9999 and *got_frame_ptr = 0
2747 *got_frame_ptr = 0; // Replicate old API behaviour
2749 int sendReturn = avcodec_send_packet(avctx, avpkt);
2751 if (sendReturn < 0) return -9999; // error, shouldn't happen, just crash out.
2753 // Don't use this code
2754 // avcodec_receive_frame needs to be called multiple times
2755 // to ensure reception of all decoded data
2756 int recReturn = avcodec_receive_frame(avctx, frame);
2758 if (recReturn == 0) // success
2760 // set got_frame_ptr to 1, this is the old behaviour
2762 // return number of bytes consumed
2763 // guessing here that the calling code only ever supplies whole packets
2768 return -9999; // no idea. looks like calling code checks got_frame_ptr