muted = 0;
lastAType = MPTYPE_MPEG_AUDIO;
- canpass_ac3=false;
- canpass_mp2=false;
- canpass_mp3=false;
- canpass_aac=false;
- canpass_pcm_mch=false;
+ canpass_ac3 = false;
+ canpass_mp2 = false;
+ canpass_mp3 = false;
+ canpass_aac = false;
+ canpass_pcm_mch = false;
- prefered_ac3=0; //0 stereo PCM, 1 passthrough 2 Multichannel PCM
- prefered_mp2=0;
- prefered_mp3=0;
- prefered_aac=0;
- hdmi=true;
+ prefered_ac3 = 0; //0 stereo PCM, 1 passthrough 2 Multichannel PCM
+ prefered_mp2 = 0;
+ prefered_mp3 = 0;
+ prefered_aac = 0;
+ hdmi = true;
- omx_running=false;
+ omx_running = false;
- omx_aud_rend/*dec*/=0;
- cur_input_buf_omx=NULL;
+ omx_aud_rend/*dec*/ = 0;
+ cur_input_buf_omx = NULL;
- ac3codec_libav=NULL;
- ac3codec_context_libav=NULL;
+ ac3codec_libav = NULL;
+ ac3codec_context_libav = NULL;
- mp23codec_libav=NULL;
- mp23codec_context_libav=NULL;
+ mp23codec_libav = NULL;
+ mp23codec_context_libav = NULL;
- resam_con_libav=NULL;
+ resam_con_libav = NULL;
-
-
- decompress_buffer=NULL;
- decompress_buffer_size=0;
- decompress_buffer_filled=0;
- mp3sameheader=0;
- mp3sameheadercount=0;
+ decompress_buffer = NULL;
+ decompress_buffer_size = 0;
+ decompress_buffer_filled = 0;
+ mp3sameheader = 0;
+ mp3sameheadercount = 0;
strcpy(L_VPE_OMX_AUDIO_REND, VPE_OMX_AUDIO_REND);
}
{
}
-int AudioOMX::init(u1 tstreamType) {
- if (initted)
- return 0;
- initted = 1;
+int AudioOMX::init(u1 tstreamType)
+{
+ if (initted)
+ return 0;
+
+ initted = 1;
- streamType = tstreamType;
+ streamType = tstreamType;
- if (!initAllParams()) {
- shutdown();
- return 0;
- }
+ if (!initAllParams())
+ {
+ shutdown();
+ return 0;
+ }
- unMute();
+ unMute();
- decompress_buffer_size=20000;
- decompress_buffer=static_cast<u1*>(malloc(decompress_buffer_size));
- decompress_buffer_filled=0;
+ decompress_buffer_size = 20000;
+ decompress_buffer = static_cast<u1*>(malloc(decompress_buffer_size));
+ decompress_buffer_filled = 0;
#if LIBAVFORMAT_VERSION_INT < AV_VERSION_INT(58, 9, 100)
- av_register_all();
+ av_register_all();
#endif
- av_log_set_flags(AV_LOG_SKIP_REPEATED);
-
- ac3codec_libav = avcodec_find_decoder(AV_CODEC_ID_AC3);
- if (ac3codec_libav == NULL) {
- LogNT::getInstance()->debug(TAG,
- "Find libav ac3 decoder failed");
- return 0;
- }
-
- mp23codec_libav = avcodec_find_decoder(AV_CODEC_ID_MP3);
- if (mp23codec_libav == NULL) {
- LogNT::getInstance()->debug(TAG,
- "Find libav mpeg audio decoder failed");
- return 0;
- }
-
- aaclatmcodec_libav = avcodec_find_decoder(AV_CODEC_ID_AAC_LATM);
- if (aaclatmcodec_libav == NULL) {
- LogNT::getInstance()->debug(TAG,
- "Find libav aac latm decoder failed");
- return 0;
- }
-
- int ret;
-
- ret=vc_tv_hdmi_audio_supported( EDID_AudioFormat_eMPEG1,2,EDID_AudioSampleRate_e48KHz,0);
- if (ret==0) {
- //canpass_mp2=true;
- // not implemented
- LogNT::getInstance()->info(TAG,
- "TV hdmi supports mpeg1 layer 1 and 2");
- }
- ret=vc_tv_hdmi_audio_supported( EDID_AudioFormat_eMP3,2,EDID_AudioSampleRate_e48KHz,0);
- if (ret==0) {
- //canpass_mp3=true;
- // not implemented
- LogNT::getInstance()->info(TAG,
- "TV hdmi supports mpeg1 layer 3");
- }
-
- ret=vc_tv_hdmi_audio_supported( EDID_AudioFormat_eAC3,6,EDID_AudioSampleRate_e48KHz,0);
- if (ret==0) {
- canpass_ac3=true;
- LogNT::getInstance()->info(TAG,
- "TV hdmi supports AC3");
- }
- ret=vc_tv_hdmi_audio_supported( EDID_AudioFormat_eAAC,6,EDID_AudioSampleRate_e48KHz,0);
- if (ret==0) {
- canpass_aac=true;
- //not implemented
- LogNT::getInstance()->info(TAG,
- "TV hdmi supports AAC");
- }
-
- canpass_pcm_mch=false;
-
- return 1;
+ av_log_set_flags(AV_LOG_SKIP_REPEATED);
+
+ ac3codec_libav = avcodec_find_decoder(AV_CODEC_ID_AC3);
+
+ if (ac3codec_libav == NULL)
+ {
+ LogNT::getInstance()->debug(TAG, "Find libav ac3 decoder failed");
+ return 0;
+ }
+
+ mp23codec_libav = avcodec_find_decoder(AV_CODEC_ID_MP3);
+
+ if (mp23codec_libav == NULL)
+ {
+ LogNT::getInstance()->debug(TAG, "Find libav mpeg audio decoder failed");
+ return 0;
+ }
+
+ aaclatmcodec_libav = avcodec_find_decoder(AV_CODEC_ID_AAC_LATM);
+
+ if (aaclatmcodec_libav == NULL)
+ {
+ LogNT::getInstance()->debug(TAG, "Find libav aac latm decoder failed");
+ return 0;
+ }
+
+ int ret;
+
+ ret = vc_tv_hdmi_audio_supported( EDID_AudioFormat_eMPEG1, 2, EDID_AudioSampleRate_e48KHz, 0);
+
+ if (ret == 0)
+ {
+ //canpass_mp2=true;
+ // not implemented
+ LogNT::getInstance()->info(TAG, "TV hdmi supports mpeg1 layer 1 and 2");
+ }
+
+ ret = vc_tv_hdmi_audio_supported( EDID_AudioFormat_eMP3, 2, EDID_AudioSampleRate_e48KHz, 0);
+
+ if (ret == 0)
+ {
+ //canpass_mp3=true;
+ // not implemented
+ LogNT::getInstance()->info(TAG, "TV hdmi supports mpeg1 layer 3");
+ }
+
+ ret = vc_tv_hdmi_audio_supported( EDID_AudioFormat_eAC3, 6, EDID_AudioSampleRate_e48KHz, 0);
+
+ if (ret == 0)
+ {
+ canpass_ac3 = true;
+ LogNT::getInstance()->info(TAG, "TV hdmi supports AC3");
+ }
+
+ ret = vc_tv_hdmi_audio_supported( EDID_AudioFormat_eAAC, 6, EDID_AudioSampleRate_e48KHz, 0);
+
+ if (ret == 0)
+ {
+ canpass_aac = true;
+ //not implemented
+ LogNT::getInstance()->info(TAG, "TV hdmi supports AAC");
+ }
+
+ canpass_pcm_mch = false;
+
+ return 1;
}
int AudioOMX::initAllParams()
int AudioOMX::shutdown()
{
if (!initted) return 0;
+
initted = 0;
LogNT::getInstance()->debug(TAG, "audio shutdown called");
DeAllocateCodecsOMX();
free(decompress_buffer);
- decompress_buffer=NULL;
- decompress_buffer_size=0;
- decompress_buffer_filled=0;
+ decompress_buffer = NULL;
+ decompress_buffer_size = 0;
+ decompress_buffer_filled = 0;
return 1;
}
bool AudioOMX::loadOptionsFromServer(VDR* vdr)
{
- LogNT::getInstance()->debug(TAG, "AudioOMX config load");
- char *name=vdr->configLoad("AudioOMX","AC3DecodingMode");
-
- if (name != NULL) {
- if (STRCASECMP(name, "PCM") == 0) {
- prefered_ac3 = 0;
- } else if (STRCASECMP(name, "Passthrough") == 0) {
- prefered_ac3 = 1;
- } else if (STRCASECMP(name, "PCMMultichannel") == 0) {
- prefered_ac3 = 2;
- }
- delete[] name;
- }
-
- name = vdr->configLoad("AudioOMX", "Mp2DecodingMode");
-
- if (name != NULL) {
- if (STRCASECMP(name, "PCM") == 0) {
- prefered_mp2 = 0;
- } else if (STRCASECMP(name, "Passthrough") == 0) {
- prefered_mp2 = 1;
- } else if (STRCASECMP(name, "PCMMultichannel") == 0) {
- prefered_mp2 = 2;
- }
- delete[] name;
- }
-
- name = vdr->configLoad("AudioOMX", "AACDecodingMode");
-
- if (name != NULL) {
- if (STRCASECMP(name, "PCM") == 0) {
- prefered_aac = 0;
- } else if (STRCASECMP(name, "Passthrough") == 0) {
- prefered_aac = 1;
- } else if (STRCASECMP(name, "PCMMultichannel") == 0) {
- prefered_aac = 2;
- }
- delete[] name;
- }
-
- name = vdr->configLoad("AudioOMX", "Mp3DecodingMode");
-
- if (name != NULL) {
- if (STRCASECMP(name, "PCM") == 0) {
- prefered_mp3 = 0;
- } else if (STRCASECMP(name, "Passthrough") == 0) {
- prefered_mp3 = 1;
- } else if (STRCASECMP(name, "PCMMultichannel") == 0) {
- prefered_mp3 = 2;
- }
- delete[] name;
- }
-
- name = vdr->configLoad("AudioOMX", "AudioOutput");
-
- if (name != NULL) {
- if (STRCASECMP(name, "analog") == 0) {
- hdmi = false;
- } else if (STRCASECMP(name, "HDMI") == 0) {
- hdmi = true;
- }
- delete[] name;
- }
-
-
- return true;
+ LogNT::getInstance()->debug(TAG, "AudioOMX config load");
+ char* name = vdr->configLoad("AudioOMX", "AC3DecodingMode");
+
+ if (name != NULL)
+ {
+ if (STRCASECMP(name, "PCM") == 0)
+ {
+ prefered_ac3 = 0;
+ }
+ else if (STRCASECMP(name, "Passthrough") == 0)
+ {
+ prefered_ac3 = 1;
+ }
+ else if (STRCASECMP(name, "PCMMultichannel") == 0)
+ {
+ prefered_ac3 = 2;
+ }
+
+ delete[] name;
+ }
+
+ name = vdr->configLoad("AudioOMX", "Mp2DecodingMode");
+
+ if (name != NULL)
+ {
+ if (STRCASECMP(name, "PCM") == 0)
+ {
+ prefered_mp2 = 0;
+ }
+ else if (STRCASECMP(name, "Passthrough") == 0)
+ {
+ prefered_mp2 = 1;
+ }
+ else if (STRCASECMP(name, "PCMMultichannel") == 0)
+ {
+ prefered_mp2 = 2;
+ }
+
+ delete[] name;
+ }
+
+ name = vdr->configLoad("AudioOMX", "AACDecodingMode");
+
+ if (name != NULL)
+ {
+ if (STRCASECMP(name, "PCM") == 0)
+ {
+ prefered_aac = 0;
+ }
+ else if (STRCASECMP(name, "Passthrough") == 0)
+ {
+ prefered_aac = 1;
+ }
+ else if (STRCASECMP(name, "PCMMultichannel") == 0)
+ {
+ prefered_aac = 2;
+ }
+
+ delete[] name;
+ }
+
+ name = vdr->configLoad("AudioOMX", "Mp3DecodingMode");
+
+ if (name != NULL)
+ {
+ if (STRCASECMP(name, "PCM") == 0)
+ {
+ prefered_mp3 = 0;
+ }
+ else if (STRCASECMP(name, "Passthrough") == 0)
+ {
+ prefered_mp3 = 1;
+ }
+ else if (STRCASECMP(name, "PCMMultichannel") == 0)
+ {
+ prefered_mp3 = 2;
+ }
+
+ delete[] name;
+ }
+
+ name = vdr->configLoad("AudioOMX", "AudioOutput");
+
+ if (name != NULL)
+ {
+ if (STRCASECMP(name, "analog") == 0)
+ {
+ hdmi = false;
+ }
+ else if (STRCASECMP(name, "HDMI") == 0)
+ {
+ hdmi = true;
+ }
+
+ delete[] name;
+ }
+
+
+ return true;
}
bool AudioOMX::handleOptionChanges(Option* option)
{
- if (Audio::handleOptionChanges(option))
- return true;
- switch (option->id) {
- case 4: {
- if (STRCASECMP(option->options[option->userSetChoice], "analog") == 0) {
- hdmi = false;
- } else if (STRCASECMP(option->options[option->userSetChoice], "HDMI")
- == 0) {
- hdmi = true;
- }
- return true;
- }
- break;
- case 1: {
- if (STRCASECMP(option->options[option->userSetChoice], "PCM") == 0) {
- prefered_ac3 = 0;
- } else if (STRCASECMP(option->options[option->userSetChoice],
- "Passthrough") == 0) {
- prefered_ac3 = 1;
- } else if (STRCASECMP(option->options[option->userSetChoice],
- "PCMMultichannel") == 0) {
- prefered_ac3 = 2;
- }
- }
- break;
- case 2: {
- if (STRCASECMP(option->options[option->userSetChoice], "PCM") == 0) {
- prefered_mp2 = 0;
- } else if (STRCASECMP(option->options[option->userSetChoice],
- "Passthrough") == 0) {
- prefered_mp2 = 1;
- } else if (STRCASECMP(option->options[option->userSetChoice],
- "PCMMultichannel") == 0) {
- prefered_mp2 = 2;
- }
- }
- break;
- case 3: {
- if (STRCASECMP(option->options[option->userSetChoice], "PCM") == 0) {
- prefered_mp3 = 0;
- } else if (STRCASECMP(option->options[option->userSetChoice],
- "Passthrough") == 0) {
- prefered_mp3 = 1;
- } else if (STRCASECMP(option->options[option->userSetChoice],
- "PCMMultichannel") == 0) {
- prefered_mp3 = 2;
- }
- }
- break;
- case 5: {
- if (STRCASECMP(option->options[option->userSetChoice], "PCM") == 0) {
- prefered_aac = 0;
- } else if (STRCASECMP(option->options[option->userSetChoice],
- "Passthrough") == 0) {
- prefered_aac = 1;
- } else if (STRCASECMP(option->options[option->userSetChoice],
- "PCMMultichannel") == 0) {
- prefered_aac = 2;
- }
- }
- break;
- };
- return false;
+ if (Audio::handleOptionChanges(option))
+ return true;
+
+ switch (option->id)
+ {
+ case 4:
+ {
+ if (STRCASECMP(option->options[option->userSetChoice], "analog") == 0)
+ {
+ hdmi = false;
+ }
+ else if (STRCASECMP(option->options[option->userSetChoice], "HDMI")
+ == 0)
+ {
+ hdmi = true;
+ }
+
+ return true;
+ }
+ break;
+
+ case 1:
+ {
+ if (STRCASECMP(option->options[option->userSetChoice], "PCM") == 0)
+ {
+ prefered_ac3 = 0;
+ }
+ else if (STRCASECMP(option->options[option->userSetChoice], "Passthrough") == 0)
+ {
+ prefered_ac3 = 1;
+ }
+ else if (STRCASECMP(option->options[option->userSetChoice], "PCMMultichannel") == 0)
+ {
+ prefered_ac3 = 2;
+ }
+ }
+ break;
+
+ case 2:
+ {
+ if (STRCASECMP(option->options[option->userSetChoice], "PCM") == 0)
+ {
+ prefered_mp2 = 0;
+ }
+ else if (STRCASECMP(option->options[option->userSetChoice], "Passthrough") == 0)
+ {
+ prefered_mp2 = 1;
+ }
+ else if (STRCASECMP(option->options[option->userSetChoice], "PCMMultichannel") == 0)
+ {
+ prefered_mp2 = 2;
+ }
+ }
+ break;
+
+ case 3:
+ {
+ if (STRCASECMP(option->options[option->userSetChoice], "PCM") == 0)
+ {
+ prefered_mp3 = 0;
+ }
+ else if (STRCASECMP(option->options[option->userSetChoice], "Passthrough") == 0)
+ {
+ prefered_mp3 = 1;
+ }
+ else if (STRCASECMP(option->options[option->userSetChoice], "PCMMultichannel") == 0)
+ {
+ prefered_mp3 = 2;
+ }
+ }
+ break;
+
+ case 5:
+ {
+ if (STRCASECMP(option->options[option->userSetChoice], "PCM") == 0)
+ {
+ prefered_aac = 0;
+ }
+ else if (STRCASECMP(option->options[option->userSetChoice], "Passthrough") == 0)
+ {
+ prefered_aac = 1;
+ }
+ else if (STRCASECMP(option->options[option->userSetChoice], "PCMMultichannel") == 0)
+ {
+ prefered_aac = 2;
+ }
+ }
+ break;
+ }
+
+ return false;
}
bool AudioOMX::saveOptionstoServer()
{
- switch (prefered_ac3) {
- case 0:
- VDR::getInstance()->configSave("AudioOMX", "AC3DecodingMode", "PCM");
- break;
- case 1:
- VDR::getInstance()->configSave("AudioOMX", "AC3DecodingMode",
- "Passthrough");
- break;
- case 2:
- VDR::getInstance()->configSave("AudioOMX", "AC3DecodingMode",
- "PCMMultichannel");
- break;
- };
-
- switch (prefered_aac) {
- case 0:
- VDR::getInstance()->configSave("AudioOMX", "AACDecodingMode", "PCM");
- break;
- case 1:
- VDR::getInstance()->configSave("AudioOMX", "AACDecodingMode",
- "Passthrough");
- break;
- case 2:
- VDR::getInstance()->configSave("AudioOMX", "AACDecodingMode",
- "PCMMultichannel");
- break;
- };
-
- switch (prefered_mp2) {
- case 0:
- VDR::getInstance()->configSave("AudioOMX", "Mp2DecodingMode", "PCM");
- break;
- case 1:
- VDR::getInstance()->configSave("AudioOMX", "Mp2DecodingMode",
- "Passthrough");
- break;
- case 2:
- VDR::getInstance()->configSave("AudioOMX", "Mp2DecodingMode",
- "PCMMultichannel");
- break;
- };
-
- switch (prefered_mp3) {
- case 0:
- VDR::getInstance()->configSave("AudioOMX", "Mp3DecodingMode", "PCM");
- break;
- case 1:
- VDR::getInstance()->configSave("AudioOMX", "Mp3DecodingMode",
- "Passthrough");
- break;
- case 2:
- VDR::getInstance()->configSave("AudioOMX", "Mp3DecodingMode",
- "PCMMultichannel");
- break;
- };
-
- if (!hdmi)
- VDR::getInstance()->configSave("AudioOMX", "AudioOutput", "analog");
- else
- VDR::getInstance()->configSave("AudioOMX", "AudioOutput", "HDMI");
+ switch (prefered_ac3)
+ {
+ case 0:
+ VDR::getInstance()->configSave("AudioOMX", "AC3DecodingMode", "PCM");
+ break;
+ case 1:
+ VDR::getInstance()->configSave("AudioOMX", "AC3DecodingMode", "Passthrough");
+ break;
- return true;
+ case 2:
+ VDR::getInstance()->configSave("AudioOMX", "AC3DecodingMode", "PCMMultichannel");
+ break;
+ }
+
+ switch (prefered_aac)
+ {
+ case 0:
+ VDR::getInstance()->configSave("AudioOMX", "AACDecodingMode", "PCM");
+ break;
+
+ case 1:
+ VDR::getInstance()->configSave("AudioOMX", "AACDecodingMode", "Passthrough");
+ break;
+
+ case 2:
+ VDR::getInstance()->configSave("AudioOMX", "AACDecodingMode", "PCMMultichannel");
+ break;
+ }
+
+ switch (prefered_mp2)
+ {
+ case 0:
+ VDR::getInstance()->configSave("AudioOMX", "Mp2DecodingMode", "PCM");
+ break;
+
+ case 1:
+ VDR::getInstance()->configSave("AudioOMX", "Mp2DecodingMode", "Passthrough");
+ break;
+
+ case 2:
+ VDR::getInstance()->configSave("AudioOMX", "Mp2DecodingMode", "PCMMultichannel");
+ break;
+ }
+
+ switch (prefered_mp3)
+ {
+ case 0:
+ VDR::getInstance()->configSave("AudioOMX", "Mp3DecodingMode", "PCM");
+ break;
+
+ case 1:
+ VDR::getInstance()->configSave("AudioOMX", "Mp3DecodingMode", "Passthrough");
+ break;
+
+ case 2:
+ VDR::getInstance()->configSave("AudioOMX", "Mp3DecodingMode", "PCMMultichannel");
+ break;
+ }
+
+ if (!hdmi)
+ VDR::getInstance()->configSave("AudioOMX", "AudioOutput", "analog");
+ else
+ VDR::getInstance()->configSave("AudioOMX", "AudioOutput", "HDMI");
+
+
+ return true;
}
/*Option(u4 id, const char* displayText, const char* configSection, const char* configKey, u4 optionType,
u4 numChoices, u4 defaultChoice, u4 startInt,
const char * const * options, const char * const * optionkeys = NULL, AbstractOption* handler=NULL);*/
-bool AudioOMX::addOptionsToPanes(int panenumber,Options *options,WOptionPane* pane)
+bool AudioOMX::addOptionsToPanes(int panenumber, Options* options, WOptionPane* pane)
{
- if (!Audio::addOptionsToPanes(panenumber,options,pane)) return false;
+ if (!Audio::addOptionsToPanes(panenumber, options, pane)) return false;
+
+ Option* option;
+
+ if (panenumber == 2)
+ {
+ static const char* audioopts[] = {"analog", "HDMI"};
+ option = new Option(4, tr("Audio Output"), "AudioOMX", "AudioOutput", Option::TYPE_TEXT, 2, 0, 0, audioopts, NULL, false, this);
+ options->push_back(option);
+ pane->addOptionLine(option);
- Option* option;
- if (panenumber == 2)
+ char** ac3opts = new char* [3];
+ int i = 0;
+ ac3opts[i] = new char[strlen("PCM") + 1];
+ strcpy(ac3opts[i], "PCM");
+ i++;
+
+ if (canpass_ac3)
+ {
+ ac3opts[i] = new char[strlen("Passthrough") + 1];
+ strcpy(ac3opts[i], "PassThrough");
+ i++;
+ }
+
+ if (canpass_pcm_mch)
{
+ ac3opts[i] = new char[strlen("PCMMultichannel") + 1];
+ strcpy(ac3opts[i], "PCMMultichannel");
+ i++;
+ }
- static const char* audioopts[]={"analog","HDMI"};
- option = new Option(4,tr("Audio Output"), "AudioOMX","AudioOutput",Option::TYPE_TEXT,2,0,0,audioopts,NULL,false,this);
+ option = new Option(1, tr("AC3 HDMI Mode"), "AudioOMX", "AC3DecodingMode", Option::TYPE_TEXT, i, 0, 0, ac3opts, NULL, true, this);
+ options->push_back(option);
+ pane->addOptionLine(option);
+
+ /* char **aacopts = new char *[3];
+ i = 0;
+ aacopts[i] = new char[strlen("PCM") + 1];
+ strcpy(mp2opts[i], "PCM");
+ i++;
+ if (canpass_aac) {
+ aacopts[i] = new char[strlen("Passthrough") + 1];
+ strcpy(aacopts[i], "PassThrough");
+ i++;
+ }
+ if (canpass_pcm_mch) {
+ aacopts[i] = new char[strlen("PCMMultichannel") + 1];
+ strcpy(aacopts[i], "PCMMultichannel");
+ i++;
+ }
+ option = new Option(5, tr("Mp2 HDMI Mode"), "AudioOMX",
+ "AACDecodingMode", Option::TYPE_TEXT, i, 0, 0,
+ aacopts, NULL, true, this);
+ options->push_back(option);
+ pane->addOptionLine(option);
+
+
+ char **mp2opts = new char *[3];
+ i = 0;
+ mp2opts[i] = new char[strlen("PCM") + 1];
+ strcpy(mp2opts[i], "PCM");
+ i++;
+ if (canpass_mp2) {
+ mp2opts[i] = new char[strlen("Passthrough") + 1];
+ strcpy(mp2opts[i], "PassThrough");
+ i++;
+ }
+ if (canpass_pcm_mch) {
+ mp2opts[i] = new char[strlen("PCMMultichannel") + 1];
+ strcpy(mp2opts[i], "PCMMultichannel");
+ i++;
+ }
+ option = new Option(2, tr("Mp2 HDMI Mode"), "AudioOMX",
+ "Mp2DecodingMode", Option::TYPE_TEXT, i, 0, 0,
+ mp2opts, NULL, true, this);
options->push_back(option);
pane->addOptionLine(option);
+ char **mp3opts = new char *[3];
+ i = 0;
+ mp3opts[i] = new char[strlen("PCM") + 1];
+ strcpy(mp3opts[i], "PCM");
+ i++;
+ if (canpass_mp3) {
+ mp3opts[i] = new char[strlen("Passthrough") + 1];
+ strcpy(mp3opts[i], "PassThrough");
+ i++;
+ }
+ if (canpass_pcm_mch) {
+ mp3opts[i] = new char[strlen("PCMMultichannel") + 1];
+ strcpy(mp3opts[i], "PCMMultichannel");
+ i++;
+ }
+ option = new Option(3, tr("Mp3 HDMI Mode"), "AudioOMX",
+ "Mp2DecodingMode", Option::TYPE_TEXT, i, 0, 0, mp3opts,
+ NULL, true, this);
+ options->push_back(option);
+ pane->addOptionLine(option);*/
+ // Comment unsupported modes out
- char **ac3opts=new char *[3];
- int i=0;
- ac3opts[i]=new char[strlen("PCM")+1];
- strcpy(ac3opts[i],"PCM");
- i++;
- if (canpass_ac3) {
- ac3opts[i]=new char[strlen("Passthrough")+1];
- strcpy(ac3opts[i],"PassThrough");
- i++;
- }
- if (canpass_pcm_mch) {
- ac3opts[i]=new char[strlen("PCMMultichannel")+1];
- strcpy(ac3opts[i],"PCMMultichannel");
- i++;
- }
- option = new Option(1 ,tr("AC3 HDMI Mode"), "AudioOMX", "AC3DecodingMode", Option::TYPE_TEXT, i, 0, 0, ac3opts,NULL,true, this);
- options->push_back(option);
- pane->addOptionLine(option);
-
- /* char **aacopts = new char *[3];
- i = 0;
- aacopts[i] = new char[strlen("PCM") + 1];
- strcpy(mp2opts[i], "PCM");
- i++;
- if (canpass_aac) {
- aacopts[i] = new char[strlen("Passthrough") + 1];
- strcpy(aacopts[i], "PassThrough");
- i++;
- }
- if (canpass_pcm_mch) {
- aacopts[i] = new char[strlen("PCMMultichannel") + 1];
- strcpy(aacopts[i], "PCMMultichannel");
- i++;
- }
- option = new Option(5, tr("Mp2 HDMI Mode"), "AudioOMX",
- "AACDecodingMode", Option::TYPE_TEXT, i, 0, 0,
- aacopts, NULL, true, this);
- options->push_back(option);
- pane->addOptionLine(option);
-
-
- char **mp2opts = new char *[3];
- i = 0;
- mp2opts[i] = new char[strlen("PCM") + 1];
- strcpy(mp2opts[i], "PCM");
- i++;
- if (canpass_mp2) {
- mp2opts[i] = new char[strlen("Passthrough") + 1];
- strcpy(mp2opts[i], "PassThrough");
- i++;
- }
- if (canpass_pcm_mch) {
- mp2opts[i] = new char[strlen("PCMMultichannel") + 1];
- strcpy(mp2opts[i], "PCMMultichannel");
- i++;
- }
- option = new Option(2, tr("Mp2 HDMI Mode"), "AudioOMX",
- "Mp2DecodingMode", Option::TYPE_TEXT, i, 0, 0,
- mp2opts, NULL, true, this);
- options->push_back(option);
- pane->addOptionLine(option);
-
- char **mp3opts = new char *[3];
- i = 0;
- mp3opts[i] = new char[strlen("PCM") + 1];
- strcpy(mp3opts[i], "PCM");
- i++;
- if (canpass_mp3) {
- mp3opts[i] = new char[strlen("Passthrough") + 1];
- strcpy(mp3opts[i], "PassThrough");
- i++;
- }
- if (canpass_pcm_mch) {
- mp3opts[i] = new char[strlen("PCMMultichannel") + 1];
- strcpy(mp3opts[i], "PCMMultichannel");
- i++;
- }
- option = new Option(3, tr("Mp3 HDMI Mode"), "AudioOMX",
- "Mp2DecodingMode", Option::TYPE_TEXT, i, 0, 0, mp3opts,
- NULL, true, this);
- options->push_back(option);
- pane->addOptionLine(option);*/
- // Comment unsupported modes out
-
-
- }
+ }
- return true;
+ return true;
}
-
OMX_ERRORTYPE AudioOMX::EmptyBufferDone_OMX(OMX_IN OMX_HANDLETYPE /* hcomp */, OMX_IN OMX_PTR /* appdata */, OMX_IN OMX_BUFFERHEADERTYPE* buffer)
{
//LogNT::getInstance()->info(TAG, "EmptyBufferDone");
{
if (!initted) return 0;
- // if (ioctl(fdAudio, AV_SET_AUD_STREAMTYPE, type) != 0) return 0;
+ // if (ioctl(fdAudio, AV_SET_AUD_STREAMTYPE, type) != 0) return 0;
return 1;
}
{
if (!initted) return 0;
- // if (ioctl(fdAudio, AV_SET_AUD_CHANNEL, 0) != 0) return 0;
+ // if (ioctl(fdAudio, AV_SET_AUD_CHANNEL, 0) != 0) return 0;
return 1;
}
{
if (!initted) return 0;
- // if (ioctl(fdAudio, AV_SET_AUD_SRC, 1) != 0) return 0;
+ // if (ioctl(fdAudio, AV_SET_AUD_SRC, 1) != 0) return 0;
return 1;
}
{
if (!initted) return 0;
- // if (ioctl(fdAudio, AV_SET_AUD_SYNC, 2) != 0) return 0;
+ // if (ioctl(fdAudio, AV_SET_AUD_SYNC, 2) != 0) return 0;
return 1;
}
-int AudioOMX::play() {
- if (!initted)
- return 0;
- lastAType=MPTYPE_MPEG_AUDIO;
- LogNT::getInstance()->debug(TAG, "enter play");
+int AudioOMX::play()
+{
+ if (!initted) return 0;
- static_cast<VideoOMX*>(Video::getInstance())->interlaceSwitch4Demux(); // switch resolution if necessary
+ lastAType = MPTYPE_MPEG_AUDIO;
+ LogNT::getInstance()->debug(TAG, "enter play");
- if (!AllocateCodecsOMX()) {
- return 0;
- }
- return 1;
-}
+ static_cast<VideoOMX*>(Video::getInstance())->interlaceSwitch4Demux(); // switch resolution if necessary
+ if (!AllocateCodecsOMX())
+ {
+ return 0;
+ }
+
+ return 1;
+}
int AudioOMX::ChangeAudioDestination() //clock aka omx mutex needs to be locked
{
- OMX_ERRORTYPE error;
- const char * destinations[]={"local","hdmi"};
- int dest=0;
- if (hdmi) dest=1;
- else dest=0;
-
- OMX_CONFIG_BRCMAUDIODESTINATIONTYPE auddest;
- memset(&auddest,0,sizeof(auddest));
- auddest.nSize=sizeof(auddest);
- auddest.nVersion.nVersion=OMX_VERSION;
- strcpy((char *)auddest.sName, destinations[dest]);
-
- LogNT::getInstance()->debug(TAG, "setting destination to: {}",auddest.sName);
- error=OMX_SetConfig(omx_aud_rend,OMX_IndexConfigBrcmAudioDestination,&auddest);
- if (error!=OMX_ErrorNone){
- LogNT::getInstance()->debug(TAG, "Init OMX_IndexConfigBrcmAudioDestination failed {:#x} {:#x} {}", error,omx_aud_rend,auddest.sName);
- DeAllocateCodecsOMX();
- return 0;
- }
- return 1;
+ OMX_ERRORTYPE error;
+ const char* destinations[] = {"local", "hdmi"};
+ int dest = 0;
+
+ if (hdmi) dest = 1;
+ else dest = 0;
+
+ OMX_CONFIG_BRCMAUDIODESTINATIONTYPE auddest;
+ memset(&auddest, 0, sizeof(auddest));
+ auddest.nSize = sizeof(auddest);
+ auddest.nVersion.nVersion = OMX_VERSION;
+ strcpy((char*)auddest.sName, destinations[dest]);
+ LogNT::getInstance()->debug(TAG, "setting destination to: {}", auddest.sName);
+ error = OMX_SetConfig(omx_aud_rend, OMX_IndexConfigBrcmAudioDestination, &auddest);
+ if (error != OMX_ErrorNone)
+ {
+ LogNT::getInstance()->debug(TAG, "Init OMX_IndexConfigBrcmAudioDestination failed {:#x} {:#x} {}", error, omx_aud_rend, auddest.sName);
+ DeAllocateCodecsOMX();
+ return 0;
+ }
+
+ return 1;
}
int AudioOMX::ChangeAudioPortConfig(bool disport) //clock aka omx mutex needs to be locked
{
- OMX_ERRORTYPE error;
- //Ok first fidle a working configuration
- LogNT::getInstance()->debug(TAG,
- "ChangeAudioPortConfig");
-
- OMX_AUDIO_CODINGTYPE encoding;
- if (hdmi) {
- switch (lastAType) {
- case MPTYPE_MPEG_AUDIO: {
- if (prefered_mp2 == 2 && false) { //not supported yet
-
- } else {
- if (prefered_mp2 == 1 && canpass_mp2) {
- passthrough = true;
- encoding=OMX_AUDIO_CodingMP3;
- } else {
- passthrough = false;
- encoding=OMX_AUDIO_CodingPCM;
- }
- }
- }
- break;
- case MPTYPE_AAC_LATM: {
- if (prefered_aac == 2 && false) { //not supported yet
-
- } else {
- LogNT::getInstance()->debug(TAG,
- "ChangeAudioPortConfig debug {} {}",prefered_aac,canpass_aac);
- if (prefered_aac == 1 && canpass_aac) {
- passthrough = true;
- encoding=OMX_AUDIO_CodingAAC;
- } else {
- passthrough = false;
- encoding=OMX_AUDIO_CodingPCM;
- }
- }
- }
- break;
- case MPTYPE_AC3_PRE13:
- case MPTYPE_AC3: {
- if (prefered_ac3 == 2 && false) { //not supported yet
-
- } else {
- LogNT::getInstance()->debug(TAG,
- "ChangeAudioPortConfig debug {} {}",prefered_ac3,canpass_ac3);
- if (prefered_ac3 == 1 && canpass_ac3) {
- passthrough = true;
- encoding=OMX_AUDIO_CodingDDP;
- } else {
- passthrough = false;
- encoding=OMX_AUDIO_CodingPCM;
- }
- }
- }
- break;
- case MPTYPE_MPEG_AUDIO_LAYER3: {
- if (prefered_mp3 == 2 && false) { //not supported yet
-
- } else {
- if (prefered_mp3 == 1 && canpass_mp2) {
- passthrough = true;
- encoding=OMX_AUDIO_CodingMP3;
- } else {
- passthrough = false;
- encoding=OMX_AUDIO_CodingPCM;
- }
- }
- }
- break;
- };
- } else {
- passthrough=false;
- encoding=OMX_AUDIO_CodingPCM;
- //mch=false; // multichannel also false
- }
-
-
-
- /*OMX_CONFIG_BOOLEANTYPE booly;
- memset(&booly, 0, sizeof(booly));
- booly.nSize = sizeof(booly);
- booly.nVersion.nVersion = OMX_VERSION;
- if (passthrough)
- booly.bEnabled = OMX_TRUE;
- else
- booly.bEnabled = OMX_FALSE;
-
- error = OMX_SetParameter(omx_aud_dec, OMX_IndexParamBrcmDecoderPassThrough,
- &booly);
- if (error != OMX_ErrorNone) {
- LogNT::getInstance()->debug(TAG,
- "Init OMX_IndexParamBrcmDecoderPassThrough failed {:#x}", error);
- DeAllocateCodecsOMX();
- return 0;
- }*/
- VideoOMX* video = static_cast<VideoOMX*>(Video::getInstance());
- if (disport) {
- video->DisablePort(omx_aud_rend,omx_rend_input_port,false);
- //DestroyInputBufsOMXwhilePlaying();
- //video->CommandFinished(omx_aud_rend,OMX_CommandPortDisable,omx_rend_input_port);
-
- }
-
-
- OMX_AUDIO_PARAM_PORTFORMATTYPE format;
- memset(&format, 0, sizeof(format));
- format.nSize = sizeof(format);
- format.nVersion.nVersion = OMX_VERSION;
- format.nPortIndex = omx_rend_input_port;
- error = OMX_GetParameter(omx_aud_rend, OMX_IndexParamAudioPortFormat,
- &format);
- if (error != OMX_ErrorNone) {
- LogNT::getInstance()->debug(TAG,
- "Get OMX_IndexParamAudioPortFormat failed {:#x} {}", error,
- omx_rend_input_port);
- return 0;
- }
- if (disport)
-
- LogNT::getInstance()->debug(TAG,
- "Get OMX_IndexParamAudioPortFormat returned {}",format.eEncoding );
- format.eEncoding = encoding;
-
- error = OMX_SetParameter(omx_aud_rend, OMX_IndexParamAudioPortFormat,
- &format);
- if (error != OMX_ErrorNone) {
- LogNT::getInstance()->debug(TAG,
- "Set OMX_IndexParamAudioPortFormat failed {:#x} {} {}", error,
- omx_rend_input_port,format.eEncoding );
- //return 0;
- }
-
- switch (encoding) {
- case OMX_AUDIO_CodingPCM: {
- OMX_AUDIO_PARAM_PCMMODETYPE audio_pcm;
- memset(&audio_pcm, 0, sizeof(audio_pcm));
- audio_pcm.nSize = sizeof(audio_pcm);
- audio_pcm.nVersion.nVersion = OMX_VERSION;
- audio_pcm.nChannels = 2;
- audio_pcm.eChannelMapping[0] = OMX_AUDIO_ChannelLF;
- audio_pcm.eChannelMapping[1] = OMX_AUDIO_ChannelRF;
- //audio_pcm.eChannelMapping[2]=OMX_AUDIO_ChannelMax;
- audio_pcm.eNumData = OMX_NumericalDataSigned;
- audio_pcm.eEndian = OMX_EndianLittle;
- audio_pcm.bInterleaved = OMX_TRUE;
- audio_pcm.nBitPerSample = 16;
- audio_pcm.ePCMMode = OMX_AUDIO_PCMModeLinear;
- audio_pcm.nChannels = 2;
- audio_pcm.nSamplingRate = 48000;
- audio_pcm.nPortIndex = omx_rend_input_port;
- error = OMX_SetParameter(omx_aud_rend, OMX_IndexParamAudioPcm,
- &audio_pcm);
- if (error != OMX_ErrorNone) {
- LogNT::getInstance()->debug(TAG,
- "Init OMX_IndexParamAudioPcm failed {:#x} {}", error,
- omx_rend_input_port);
- return 0;
- }
- } break;
- case OMX_AUDIO_CodingDDP: {
- OMX_AUDIO_PARAM_DDPTYPE audio_ddp;
- memset(&audio_ddp, 0, sizeof(audio_ddp));
- audio_ddp.nSize = sizeof(audio_ddp);
- audio_ddp.nVersion.nVersion = OMX_VERSION;
- audio_ddp.nPortIndex = omx_rend_input_port;
- audio_ddp.nChannels = 8; //unknown
- audio_ddp.nBitRate=0;
- audio_ddp.nSampleRate=48000;
- audio_ddp.eChannelMapping[0] =OMX_AUDIO_ChannelLF;
- audio_ddp.eChannelMapping[1] =OMX_AUDIO_ChannelRF;
- audio_ddp.eChannelMapping[2] =OMX_AUDIO_ChannelCF;
- audio_ddp.eChannelMapping[3] =OMX_AUDIO_ChannelLFE;
- audio_ddp.eChannelMapping[4] =OMX_AUDIO_ChannelLR;
- audio_ddp.eChannelMapping[5] =OMX_AUDIO_ChannelRR;
- audio_ddp.eChannelMapping[6] =OMX_AUDIO_ChannelLS;
- audio_ddp.eChannelMapping[7] =OMX_AUDIO_ChannelRS;
- audio_ddp.eChannelMapping[8] =OMX_AUDIO_ChannelCS;
- error = OMX_SetParameter(omx_aud_rend, OMX_IndexParamAudioDdp,
- &audio_ddp);
- if (error != OMX_ErrorNone) {
- LogNT::getInstance()->debug(TAG,
- "Init OMX_IndexParamAudioDdp failed {:#x} {}", error,
- omx_rend_input_port);
- return 0;
- }
-
- } break;
- default: break; //Make compiler happy
- };
-
-
-
- if (disport) {
-
- //PrepareInputBufsOMX(false);
- video->EnablePort(omx_aud_rend,omx_rend_input_port,false);
- }
-
-
-
- return 1;
+ OMX_ERRORTYPE error;
+ //Ok first fidle a working configuration
+ LogNT::getInstance()->debug(TAG, "ChangeAudioPortConfig");
+
+ OMX_AUDIO_CODINGTYPE encoding;
+
+ if (hdmi)
+ {
+ switch (lastAType)
+ {
+ case MPTYPE_MPEG_AUDIO:
+ {
+ if (prefered_mp2 == 2 && false) //not supported yet
+ {
+
+ }
+ else
+ {
+ if (prefered_mp2 == 1 && canpass_mp2)
+ {
+ passthrough = true;
+ encoding = OMX_AUDIO_CodingMP3;
+ }
+ else
+ {
+ passthrough = false;
+ encoding = OMX_AUDIO_CodingPCM;
+ }
+ }
+ }
+ break;
+
+ case MPTYPE_AAC_LATM:
+ {
+ if (prefered_aac == 2 && false) //not supported yet
+ {
+
+ }
+ else
+ {
+ LogNT::getInstance()->debug(TAG, "ChangeAudioPortConfig debug {} {}", prefered_aac, canpass_aac);
+
+ if (prefered_aac == 1 && canpass_aac)
+ {
+ passthrough = true;
+ encoding = OMX_AUDIO_CodingAAC;
+ }
+ else
+ {
+ passthrough = false;
+ encoding = OMX_AUDIO_CodingPCM;
+ }
+ }
+ }
+ break;
+
+ case MPTYPE_AC3_PRE13:
+ case MPTYPE_AC3:
+ {
+ if (prefered_ac3 == 2 && false) //not supported yet
+ {
+
+ }
+ else
+ {
+ LogNT::getInstance()->debug(TAG, "ChangeAudioPortConfig debug {} {}", prefered_ac3, canpass_ac3);
+
+ if (prefered_ac3 == 1 && canpass_ac3)
+ {
+ passthrough = true;
+ encoding = OMX_AUDIO_CodingDDP;
+ }
+ else
+ {
+ passthrough = false;
+ encoding = OMX_AUDIO_CodingPCM;
+ }
+ }
+ }
+ break;
+
+ case MPTYPE_MPEG_AUDIO_LAYER3:
+ {
+ if (prefered_mp3 == 2 && false) //not supported yet
+ {
+
+ }
+ else
+ {
+ if (prefered_mp3 == 1 && canpass_mp2)
+ {
+ passthrough = true;
+ encoding = OMX_AUDIO_CodingMP3;
+ }
+ else
+ {
+ passthrough = false;
+ encoding = OMX_AUDIO_CodingPCM;
+ }
+ }
+ }
+ break;
+ };
+ }
+ else
+ {
+ passthrough = false;
+ encoding = OMX_AUDIO_CodingPCM;
+ //mch=false; // multichannel also false
+ }
+
+ /*OMX_CONFIG_BOOLEANTYPE booly;
+ memset(&booly, 0, sizeof(booly));
+ booly.nSize = sizeof(booly);
+ booly.nVersion.nVersion = OMX_VERSION;
+ if (passthrough)
+ booly.bEnabled = OMX_TRUE;
+ else
+ booly.bEnabled = OMX_FALSE;
+
+ error = OMX_SetParameter(omx_aud_dec, OMX_IndexParamBrcmDecoderPassThrough,
+ &booly);
+ if (error != OMX_ErrorNone) {
+ LogNT::getInstance()->debug(TAG,
+ "Init OMX_IndexParamBrcmDecoderPassThrough failed {:#x}", error);
+ DeAllocateCodecsOMX();
+ return 0;
+ }*/
+ VideoOMX* video = static_cast<VideoOMX*>(Video::getInstance());
+
+ if (disport)
+ {
+ video->DisablePort(omx_aud_rend, omx_rend_input_port, false);
+ //DestroyInputBufsOMXwhilePlaying();
+ //video->CommandFinished(omx_aud_rend,OMX_CommandPortDisable,omx_rend_input_port);
+ }
+
+
+ OMX_AUDIO_PARAM_PORTFORMATTYPE format;
+ memset(&format, 0, sizeof(format));
+ format.nSize = sizeof(format);
+ format.nVersion.nVersion = OMX_VERSION;
+ format.nPortIndex = omx_rend_input_port;
+ error = OMX_GetParameter(omx_aud_rend, OMX_IndexParamAudioPortFormat,
+ &format);
+
+ if (error != OMX_ErrorNone)
+ {
+ LogNT::getInstance()->debug(TAG, "Get OMX_IndexParamAudioPortFormat failed {:#x} {}", error, omx_rend_input_port);
+ return 0;
+ }
+
+ if (disport)
+
+ LogNT::getInstance()->debug(TAG, "Get OMX_IndexParamAudioPortFormat returned {}", format.eEncoding );
+
+ format.eEncoding = encoding;
+
+ error = OMX_SetParameter(omx_aud_rend, OMX_IndexParamAudioPortFormat, &format);
+
+ if (error != OMX_ErrorNone)
+ {
+ LogNT::getInstance()->debug(TAG, "Set OMX_IndexParamAudioPortFormat failed {:#x} {} {}", error, omx_rend_input_port, format.eEncoding);
+ //return 0;
+ }
+ switch (encoding)
+ {
+ case OMX_AUDIO_CodingPCM:
+ {
+ OMX_AUDIO_PARAM_PCMMODETYPE audio_pcm;
+ memset(&audio_pcm, 0, sizeof(audio_pcm));
+ audio_pcm.nSize = sizeof(audio_pcm);
+ audio_pcm.nVersion.nVersion = OMX_VERSION;
+ audio_pcm.nChannels = 2;
+ audio_pcm.eChannelMapping[0] = OMX_AUDIO_ChannelLF;
+ audio_pcm.eChannelMapping[1] = OMX_AUDIO_ChannelRF;
+ //audio_pcm.eChannelMapping[2]=OMX_AUDIO_ChannelMax;
+ audio_pcm.eNumData = OMX_NumericalDataSigned;
+ audio_pcm.eEndian = OMX_EndianLittle;
+ audio_pcm.bInterleaved = OMX_TRUE;
+ audio_pcm.nBitPerSample = 16;
+ audio_pcm.ePCMMode = OMX_AUDIO_PCMModeLinear;
+ audio_pcm.nChannels = 2;
+ audio_pcm.nSamplingRate = 48000;
+ audio_pcm.nPortIndex = omx_rend_input_port;
+ error = OMX_SetParameter(omx_aud_rend, OMX_IndexParamAudioPcm, &audio_pcm);
+
+ if (error != OMX_ErrorNone)
+ {
+ LogNT::getInstance()->debug(TAG, "Init OMX_IndexParamAudioPcm failed {:#x} {}", error, omx_rend_input_port);
+ return 0;
+ }
+ }
+ break;
+
+ case OMX_AUDIO_CodingDDP:
+ {
+ OMX_AUDIO_PARAM_DDPTYPE audio_ddp;
+ memset(&audio_ddp, 0, sizeof(audio_ddp));
+ audio_ddp.nSize = sizeof(audio_ddp);
+ audio_ddp.nVersion.nVersion = OMX_VERSION;
+ audio_ddp.nPortIndex = omx_rend_input_port;
+ audio_ddp.nChannels = 8; //unknown
+ audio_ddp.nBitRate = 0;
+ audio_ddp.nSampleRate = 48000;
+ audio_ddp.eChannelMapping[0] = OMX_AUDIO_ChannelLF;
+ audio_ddp.eChannelMapping[1] = OMX_AUDIO_ChannelRF;
+ audio_ddp.eChannelMapping[2] = OMX_AUDIO_ChannelCF;
+ audio_ddp.eChannelMapping[3] = OMX_AUDIO_ChannelLFE;
+ audio_ddp.eChannelMapping[4] = OMX_AUDIO_ChannelLR;
+ audio_ddp.eChannelMapping[5] = OMX_AUDIO_ChannelRR;
+ audio_ddp.eChannelMapping[6] = OMX_AUDIO_ChannelLS;
+ audio_ddp.eChannelMapping[7] = OMX_AUDIO_ChannelRS;
+ audio_ddp.eChannelMapping[8] = OMX_AUDIO_ChannelCS;
+ error = OMX_SetParameter(omx_aud_rend, OMX_IndexParamAudioDdp, &audio_ddp);
+
+ if (error != OMX_ErrorNone)
+ {
+ LogNT::getInstance()->debug(TAG,
+ "Init OMX_IndexParamAudioDdp failed {:#x} {}", error,
+ omx_rend_input_port);
+ return 0;
+ }
+ }
+ break;
+
+ default: break; //Make compiler happy
+ };
+
+ if (disport)
+ {
+
+ //PrepareInputBufsOMX(false);
+ video->EnablePort(omx_aud_rend, omx_rend_input_port, false);
+ }
+
+ return 1;
}
+
int AudioOMX::InitDecoderLibAV()
{
- libav_mutex.lock();
- ac3codec_context_libav = avcodec_alloc_context3(ac3codec_libav);
- if (!ac3codec_context_libav) {
- LogNT::getInstance()->debug(TAG, "Alloc avcodec for ac3 decoding context failed!");
- return 0;
- }
+ libav_mutex.lock();
+ ac3codec_context_libav = avcodec_alloc_context3(ac3codec_libav);
+
+ if (!ac3codec_context_libav)
+ {
+ LogNT::getInstance()->debug(TAG, "Alloc avcodec for ac3 decoding context failed!");
+ return 0;
+ }
#if LIBAVCODEC_VERSION_INT >= AV_VERSION_INT(56, 34, 1)
- ac3codec_context_libav->flags |= AV_CODEC_FLAG_TRUNCATED;
+ ac3codec_context_libav->flags |= AV_CODEC_FLAG_TRUNCATED;
#else
- ac3codec_context_libav->flags |= CODEC_FLAG_TRUNCATED;
+ ac3codec_context_libav->flags |= CODEC_FLAG_TRUNCATED;
#endif
#if LIBAVCODEC_VERSION_INT >= AV_VERSION_INT(57, 64, 101)
- ac3codec_context_libav->request_channel_layout=2;
+ ac3codec_context_libav->request_channel_layout = 2;
#else
- ac3codec_context_libav->request_channels=2;
+ ac3codec_context_libav->request_channels = 2;
#endif
- int avc_ret = avcodec_open2(ac3codec_context_libav, ac3codec_libav, NULL);
- if (avc_ret < 0) {
- LogNT::getInstance()->debug(TAG, "Opening libav codec failed");
- libav_mutex.unlock();
- return 0;
- }
+ int avc_ret = avcodec_open2(ac3codec_context_libav, ac3codec_libav, NULL);
+
+ if (avc_ret < 0)
+ {
+ LogNT::getInstance()->debug(TAG, "Opening libav codec failed");
+ libav_mutex.unlock();
+ return 0;
+ }
+
+ aaclatmcodec_context_libav = avcodec_alloc_context3(aaclatmcodec_libav);
- aaclatmcodec_context_libav = avcodec_alloc_context3(aaclatmcodec_libav);
- if (!aaclatmcodec_context_libav) {
- LogNT::getInstance()->debug(TAG, "Alloc avcodec for aac decoding context failed!");
- return 0;
- }
+ if (!aaclatmcodec_context_libav)
+ {
+ LogNT::getInstance()->debug(TAG, "Alloc avcodec for aac decoding context failed!");
+ return 0;
+ }
#if LIBAVCODEC_VERSION_INT >= AV_VERSION_INT(56, 34, 1)
- aaclatmcodec_context_libav->flags |= AV_CODEC_FLAG_TRUNCATED;
+ aaclatmcodec_context_libav->flags |= AV_CODEC_FLAG_TRUNCATED;
#else
- aaclatmcodec_context_libav->flags |= CODEC_FLAG_TRUNCATED;
+ aaclatmcodec_context_libav->flags |= CODEC_FLAG_TRUNCATED;
#endif
#if LIBAVCODEC_VERSION_INT >= AV_VERSION_INT(57, 64, 101)
- aaclatmcodec_context_libav->request_channel_layout=2;
+ aaclatmcodec_context_libav->request_channel_layout = 2;
#else
- aaclatmcodec_context_libav->request_channels=2;
+ aaclatmcodec_context_libav->request_channels = 2;
#endif
- avc_ret = avcodec_open2(aaclatmcodec_context_libav, aaclatmcodec_libav, NULL);
- if (avc_ret < 0) {
- LogNT::getInstance()->debug(TAG, "Opening libav codec failed");
- libav_mutex.unlock();
- return 0;
- }
+ avc_ret = avcodec_open2(aaclatmcodec_context_libav, aaclatmcodec_libav, NULL);
+
+ if (avc_ret < 0)
+ {
+ LogNT::getInstance()->debug(TAG, "Opening libav codec failed");
+ libav_mutex.unlock();
+ return 0;
+ }
+ mp23codec_context_libav = avcodec_alloc_context3(mp23codec_libav);
- mp23codec_context_libav = avcodec_alloc_context3(mp23codec_libav);
- if (!ac3codec_context_libav) {
- LogNT::getInstance()->debug(TAG, "Alloc avcodec for mp23 decoding context failed!");
- libav_mutex.unlock();
- return 0;
- }
+ if (!ac3codec_context_libav)
+ {
+ LogNT::getInstance()->debug(TAG, "Alloc avcodec for mp23 decoding context failed!");
+ libav_mutex.unlock();
+ return 0;
+ }
#if LIBAVCODEC_VERSION_INT >= AV_VERSION_INT(56, 34, 1)
- mp23codec_context_libav->flags |= AV_CODEC_FLAG_TRUNCATED;
+ mp23codec_context_libav->flags |= AV_CODEC_FLAG_TRUNCATED;
#else
- mp23codec_context_libav->flags |= CODEC_FLAG_TRUNCATED;
+ mp23codec_context_libav->flags |= CODEC_FLAG_TRUNCATED;
#endif
#if LIBAVCODEC_VERSION_INT >= AV_VERSION_INT(57, 64, 101)
- mp23codec_context_libav->request_channel_layout=2;
+ mp23codec_context_libav->request_channel_layout = 2;
#else
- mp23codec_context_libav->request_channels=2;
+ mp23codec_context_libav->request_channels = 2;
#endif
- avc_ret = avcodec_open2(mp23codec_context_libav, mp23codec_libav, NULL);
- if (avc_ret < 0) {
- LogNT::getInstance()->debug(TAG, "Opening libav codec failed");
- libav_mutex.unlock();
- return 0;
- }
+ avc_ret = avcodec_open2(mp23codec_context_libav, mp23codec_libav, NULL);
- resam_con_libav = swr_alloc();
- if (resam_con_libav == NULL) {
- LogNT::getInstance()->debug(TAG,
- "Alloc resample context failed");
- return 0;
- }
+ if (avc_ret < 0)
+ {
+ LogNT::getInstance()->debug(TAG, "Opening libav codec failed");
+ libav_mutex.unlock();
+ return 0;
+ }
- av_opt_set_int(resam_con_libav, "out_channel_layout", AV_CH_LAYOUT_STEREO, 0); // our standard format
- av_opt_set_int(resam_con_libav, "out_sample_rate",48000,0);
- av_opt_set_int(resam_con_libav, "out_sample_fmt",AV_SAMPLE_FMT_S16,0);
- av_opt_set_int(resam_con_libav, "matrix_encoding",AV_MATRIX_ENCODING_DPLII,0);
+ resam_con_libav = swr_alloc();
+
+ if (resam_con_libav == NULL)
+ {
+ LogNT::getInstance()->debug(TAG, "Alloc resample context failed");
+ return 0;
+ }
- av_opt_set_int(resam_con_libav, "in_sample_rate",48000,0);
- av_opt_set_int(resam_con_libav, "in_sample_fmt",AV_SAMPLE_FMT_S16,0);
- av_opt_set_int(resam_con_libav, "in_channel_layout", AV_CH_LAYOUT_5POINT1, 0); //just an example
+ av_opt_set_int(resam_con_libav, "out_channel_layout", AV_CH_LAYOUT_STEREO, 0); // our standard format
+ av_opt_set_int(resam_con_libav, "out_sample_rate", 48000, 0);
+ av_opt_set_int(resam_con_libav, "out_sample_fmt", AV_SAMPLE_FMT_S16, 0);
+ av_opt_set_int(resam_con_libav, "matrix_encoding", AV_MATRIX_ENCODING_DPLII, 0);
+ av_opt_set_int(resam_con_libav, "in_sample_rate", 48000, 0);
+ av_opt_set_int(resam_con_libav, "in_sample_fmt", AV_SAMPLE_FMT_S16, 0);
+ av_opt_set_int(resam_con_libav, "in_channel_layout", AV_CH_LAYOUT_5POINT1, 0); //just an example
- av_init_packet(&incoming_paket_libav);
+ av_init_packet(&incoming_paket_libav);
#if LIBAVCODEC_VERSION_INT >= AV_VERSION_INT(57, 64, 101)
- decode_frame_libav=av_frame_alloc();
+ decode_frame_libav = av_frame_alloc();
#else
- decode_frame_libav=avcodec_alloc_frame();
+ decode_frame_libav = avcodec_alloc_frame();
#endif
- libav_mutex.unlock();
- decompress_buffer_filled=0;
-
+ libav_mutex.unlock();
+ decompress_buffer_filled = 0;
-
- return 1;
+ return 1;
}
-void AudioOMX::DeinitDecoderLibAV() {
-
-
- libav_mutex.lock();
- if (ac3codec_context_libav) {
- avcodec_close(ac3codec_context_libav);
- av_free(ac3codec_context_libav);
- ac3codec_context_libav = NULL;
-
- avcodec_close(aaclatmcodec_context_libav);
- av_free(aaclatmcodec_context_libav);
- aaclatmcodec_context_libav = NULL;
+void AudioOMX::DeinitDecoderLibAV()
+{
+ libav_mutex.lock();
- av_free(decode_frame_libav);
+ if (ac3codec_context_libav)
+ {
+ avcodec_close(ac3codec_context_libav);
+ av_free(ac3codec_context_libav);
+ ac3codec_context_libav = NULL;
- avcodec_close(mp23codec_context_libav);
- av_free(mp23codec_context_libav);
- mp23codec_context_libav = NULL;
+ avcodec_close(aaclatmcodec_context_libav);
+ av_free(aaclatmcodec_context_libav);
+ aaclatmcodec_context_libav = NULL;
- swr_free(&resam_con_libav);
- resam_con_libav=NULL;
+ av_free(decode_frame_libav);
+ avcodec_close(mp23codec_context_libav);
+ av_free(mp23codec_context_libav);
+ mp23codec_context_libav = NULL;
- }
- libav_mutex.unlock();
+ swr_free(&resam_con_libav);
+ resam_con_libav = NULL;
+ }
+ libav_mutex.unlock();
}
-
int AudioOMX::AllocateCodecsOMX()
{
- OMX_ERRORTYPE error;
- static OMX_CALLBACKTYPE callbacks= {&VideoOMX::EventHandler_OMX,&EmptyBufferDone_OMX,&FillBufferDone_OMX};
-
- LogNT::getInstance()->info(TAG, "Allocate Codecs OMX");
- //Clock, move later to audio
- VideoOMX* video = static_cast<VideoOMX*>(Video::getInstance());
+ OMX_ERRORTYPE error;
+ static OMX_CALLBACKTYPE callbacks = {&VideoOMX::EventHandler_OMX, &EmptyBufferDone_OMX, &FillBufferDone_OMX};
- if (!InitDecoderLibAV()) return 0;;
+ LogNT::getInstance()->info(TAG, "Allocate Codecs OMX");
+ //Clock, move later to audio
+ VideoOMX* video = static_cast<VideoOMX*>(Video::getInstance());
+ if (!InitDecoderLibAV()) return 0;;
- OMX_PORT_PARAM_TYPE p_param;
- memset(&p_param,0,sizeof(p_param));
- p_param.nSize=sizeof(p_param);
- p_param.nVersion.nVersion=OMX_VERSION;
+ OMX_PORT_PARAM_TYPE p_param;
+ memset(&p_param, 0, sizeof(p_param));
+ p_param.nSize = sizeof(p_param);
+ p_param.nVersion.nVersion = OMX_VERSION;
+ if (!video->getClockAudioandInit(&omx_clock, &omx_clock_output_port))
+ {
+ return 0;// get the clock and init it if necessary
+ }
- if (!video->getClockAudioandInit(&omx_clock,&omx_clock_output_port)){
- return 0;// get the clock and init it if necessary
- }
+ /* TODO end */
+ if (!video->idleClock())
+ {
+ return 0;
+ }
- /* TODO end */
- if (!video->idleClock()) {
- return 0;
- }
- video->LockClock();
+ video->LockClock();
- error = OMX_GetHandle(&omx_aud_rend, L_VPE_OMX_AUDIO_REND, NULL, &callbacks);
- if (error != OMX_ErrorNone) {
- LogNT::getInstance()->debug(TAG,
- "Init OMX audio rend failed {:#x}", error);
- video->UnlockClock();
- DeAllocateCodecsOMX();
- return 0;
- }
+ error = OMX_GetHandle(&omx_aud_rend, L_VPE_OMX_AUDIO_REND, NULL, &callbacks);
- if (!ChangeAudioDestination()) {
- video->UnlockClock();
- DeAllocateCodecsOMX();
- return 0;
- }
+ if (error != OMX_ErrorNone)
+ {
+ LogNT::getInstance()->debug(TAG, "Init OMX audio rend failed {:#x}", error);
+ video->UnlockClock();
+ DeAllocateCodecsOMX();
+ return 0;
+ }
- error = OMX_GetParameter(omx_aud_rend, OMX_IndexParamAudioInit, &p_param);
- if (error != OMX_ErrorNone) {
- LogNT::getInstance()->debug(TAG,
- "Init OMX audio rend OMX_GetParameter failed {:#x}", error);
- video->UnlockClock();
- DeAllocateCodecsOMX();
- return 0;
- }
- omx_rend_input_port = p_param.nStartPortNumber;
+ if (!ChangeAudioDestination())
+ {
+ video->UnlockClock();
+ DeAllocateCodecsOMX();
+ return 0;
+ }
+ error = OMX_GetParameter(omx_aud_rend, OMX_IndexParamAudioInit, &p_param);
+ if (error != OMX_ErrorNone)
+ {
+ LogNT::getInstance()->debug(TAG, "Init OMX audio rend OMX_GetParameter failed {:#x}", error);
+ video->UnlockClock();
+ DeAllocateCodecsOMX();
+ return 0;
+ }
+ omx_rend_input_port = p_param.nStartPortNumber;
+ error = OMX_GetParameter(omx_aud_rend, OMX_IndexParamOtherInit, &p_param);
- error = OMX_GetParameter(omx_aud_rend, OMX_IndexParamOtherInit, &p_param);
- if (error != OMX_ErrorNone) {
- LogNT::getInstance()->debug(TAG,
- "Init OMX aud rend OMX_GetParameter failed {:#x}", error);
- video->UnlockClock();
- DeAllocateCodecsOMX();
- return 0;
- }
- // buggy return value
- omx_rend_clock_port = p_param.nStartPortNumber;
+ if (error != OMX_ErrorNone)
+ {
+ LogNT::getInstance()->debug(TAG, "Init OMX aud rend OMX_GetParameter failed {:#x}", error);
+ video->UnlockClock();
+ DeAllocateCodecsOMX();
+ return 0;
+ }
+ // buggy return value
+ omx_rend_clock_port = p_param.nStartPortNumber;
-/* error=OMX_GetHandle(&omx_aud_dec,VPE_OMX_AUDIO_DECODER,NULL,&callbacks);
+ /* error=OMX_GetHandle(&omx_aud_dec,VPE_OMX_AUDIO_DECODER,NULL,&callbacks);
- if (error!=OMX_ErrorNone){
- LogNT::getInstance()->debug(TAG, "Init OMX audio decoder failed {:#x}", error);
- video->UnlockClock();
- DeAllocateCodecsOMX();
- return 0;
- }
+ if (error!=OMX_ErrorNone){
+ LogNT::getInstance()->debug(TAG, "Init OMX audio decoder failed {:#x}", error);
+ video->UnlockClock();
+ DeAllocateCodecsOMX();
+ return 0;
+ }
- error=OMX_GetParameter(omx_aud_dec,OMX_IndexParamAudioInit,&p_param);
- if (error!=OMX_ErrorNone){
- LogNT::getInstance()->debug(TAG, "Init OMX audio decoder OMX_GetParameter failed {:#x}", error);
- video->UnlockClock();
- DeAllocateCodecsOMX();
- return 0;
- }
- omx_codec_input_port=p_param.nStartPortNumber;
- omx_codec_output_port=p_param.nStartPortNumber+1;
+ error=OMX_GetParameter(omx_aud_dec,OMX_IndexParamAudioInit,&p_param);
+ if (error!=OMX_ErrorNone){
+ LogNT::getInstance()->debug(TAG, "Init OMX audio decoder OMX_GetParameter failed {:#x}", error);
+ video->UnlockClock();
+ DeAllocateCodecsOMX();
+ return 0;
+ }
+ omx_codec_input_port=p_param.nStartPortNumber;
+ omx_codec_output_port=p_param.nStartPortNumber+1;
- if (!video->DisablePort(omx_aud_dec,omx_codec_input_port) || !video->DisablePort(omx_aud_dec,omx_codec_output_port)) {
- LogNT::getInstance()->debug(TAG, "Disable Ports OMX audio decoder failed");
- video->UnlockClock();
- DeAllocateCodecsOMX();
- return 0;
- }*/
+ if (!video->DisablePort(omx_aud_dec,omx_codec_input_port) || !video->DisablePort(omx_aud_dec,omx_codec_output_port)) {
+ LogNT::getInstance()->debug(TAG, "Disable Ports OMX audio decoder failed");
+ video->UnlockClock();
+ DeAllocateCodecsOMX();
+ return 0;
+ }*/
+ if (!video->DisablePort(omx_aud_rend, omx_rend_input_port, true) )
+ {
+ LogNT::getInstance()->debug(TAG, "Disable Ports OMX audio rend failed {}", omx_rend_input_port);
+ video->UnlockClock();
+ DeAllocateCodecsOMX();
+ return 0;
+ }
+ if ( !video->DisablePort(omx_aud_rend, omx_rend_clock_port, true))
+ {
+ LogNT::getInstance()->debug(TAG,
+ "Disable Ports OMX rend clock port failed {}", omx_rend_clock_port);
+ video->UnlockClock();
+ DeAllocateCodecsOMX();
+ return 0;
+ }
- if (!video->DisablePort(omx_aud_rend,omx_rend_input_port,true) ) {
- LogNT::getInstance()->debug(TAG, "Disable Ports OMX audio rend failed {}",omx_rend_input_port);
- video->UnlockClock();
- DeAllocateCodecsOMX();
- return 0;
- }
- if ( !video->DisablePort(omx_aud_rend, omx_rend_clock_port, true)) {
- LogNT::getInstance()->debug(TAG,
- "Disable Ports OMX rend clock port failed {}",omx_rend_clock_port);
- video->UnlockClock();
- DeAllocateCodecsOMX();
- return 0;
- }
+ // Setup chain
+ error = OMX_SetupTunnel(omx_clock, omx_clock_output_port, omx_aud_rend, omx_rend_clock_port);
+ if (error != OMX_ErrorNone)
+ {
+ LogNT::getInstance()->debug(TAG, "OMX_Setup tunnel clock to rend failed {:#x} {} {}", error, omx_clock_output_port, omx_rend_clock_port);
+ video->UnlockClock();
+ DeAllocateCodecsOMX();
+ return 0;
+ }
+ if (!video->EnablePort(omx_clock, omx_clock_output_port, false) || !video->EnablePort(omx_aud_rend, omx_rend_clock_port, false))
+ {
+ LogNT::getInstance()->debug(TAG, "Enable Ports OMX clock rend failed");
+ video->UnlockClock();
+ DeAllocateCodecsOMX();
+ return 0;
+ }
- //Setuo chain
+ if (!video->ChangeComponentState(omx_aud_rend, OMX_StateIdle))
+ {
+ LogNT::getInstance()->debug(TAG, "aud_rend idle ChangeComponentState");
+ video->UnlockClock();
+ DeAllocateCodecsOMX();
+ return 0;
+ }
+ if (!video->CommandFinished(omx_aud_rend, OMX_CommandPortEnable, omx_rend_clock_port))
+ {
+ video->UnlockClock();
+ DeAllocateCodecsOMX();
+ return 0;
+ }
- error=OMX_SetupTunnel(omx_clock,omx_clock_output_port,omx_aud_rend,omx_rend_clock_port);
- if (error!=OMX_ErrorNone){
- LogNT::getInstance()->debug(TAG, "OMX_Setup tunnel clock to rend failed {:#x} {} {}", error,omx_clock_output_port,omx_rend_clock_port);
- video->UnlockClock();
- DeAllocateCodecsOMX();
- return 0;
- }
+ if (!video->CommandFinished(omx_clock, OMX_CommandPortEnable, omx_clock_output_port))
+ {
+ video->UnlockClock();
+ DeAllocateCodecsOMX();
+ return 0;
+ }
- if (!video->EnablePort(omx_clock,omx_clock_output_port,false) || !video->EnablePort(omx_aud_rend,omx_rend_clock_port,false)
- ) {
- LogNT::getInstance()->debug(TAG, "Enable Ports OMX clock rend failed");
- video->UnlockClock();
- DeAllocateCodecsOMX();
- return 0;
- }
+ if (!ChangeAudioPortConfig(false))
+ {
+ LogNT::getInstance()->info(TAG, "Change AudioPortConfig failed");
+ video->UnlockClock();
+ DeAllocateCodecsOMX();
+ return 0;
+ }
- if (!video->ChangeComponentState(omx_aud_rend,OMX_StateIdle)) {
- LogNT::getInstance()->debug(TAG, "aud_rend idle ChangeComponentState");
- video->UnlockClock();
- DeAllocateCodecsOMX();
- return 0;
- }
+ /* if (!video->ChangeComponentState(omx_aud_dec,OMX_StateIdle)) {
+ LogNT::getInstance()->debug(TAG, "aud_dec ChangeComponentState");
+ DeAllocateCodecsOMX();
+ return 0;
+ }*/
+ if (!PrepareInputBufsOMX(true))
+ {
+ video->UnlockClock();
+ DeAllocateCodecsOMX();
+ return 0;
+ }
+ /* error=OMX_SetupTunnel(omx_aud_dec,omx_codec_output_port,omx_aud_rend,omx_rend_input_port);
+ if (error!=OMX_ErrorNone){
+ LogNT::getInstance()->debug(TAG, "OMX_Setup tunnel dec to render failed {:#x}", error);
+ video->UnlockClock();
+ DeAllocateCodecsOMX();
+ return 0;
+ }*/
+
+ /* if (!video->EnablePort(omx_aud_dec,omx_codec_output_port,false) || !video->EnablePort(omx_aud_rend,omx_rend_input_port,false)
+ ) {
+ LogNT::getInstance()->debug(TAG, "Enable Ports OMX codec rend failed");
+ video->UnlockClock();
+ DeAllocateCodecsOMX();
+ return 0;
+ }*/
+
+ /* if ( !video->CommandFinished(omx_aud_dec,OMX_CommandPortEnable,omx_codec_output_port)
+ || !video->CommandFinished(omx_aud_rend,OMX_CommandPortEnable,omx_rend_input_port)) {
+ video->UnlockClock();
+ DeAllocateCodecsOMX();
+ return 0;
+ }*/
+
+ if (!video->ChangeComponentState(omx_aud_rend, OMX_StateExecuting))
+ {
+ LogNT::getInstance()->debug(TAG, "omx_aud_rend ChangeComponentState Execute");
+ video->UnlockClock();
+ DeAllocateCodecsOMX();
+ return 0;
+ }
+ video->UnlockClock();
+ omx_running = true;
+ setVolume(volume);
+ doMuting();
+ video->clockUnpause();
- if ( !video->CommandFinished(omx_aud_rend,OMX_CommandPortEnable,omx_rend_clock_port)) {
- video->UnlockClock();
- DeAllocateCodecsOMX();
- return 0;
- }
+ if (!video->setClockExecutingandRunning()) return 0;
- if ( !video->CommandFinished(omx_clock,OMX_CommandPortEnable,omx_clock_output_port)) {
- video->UnlockClock();
- DeAllocateCodecsOMX();
- return 0;
- }
+ LogNT::getInstance()->info(TAG, "Allocate Codecs OMX finished");
+ return 1;
+}
+int AudioOMX::PrepareInputBufsOMX(bool setportdef) //needs to be called with locvke omx clock mutex
+{
+ VideoOMX* video = static_cast<VideoOMX*>(Video::getInstance());
+ OMX_ERRORTYPE error;
+ OMX_PARAM_PORTDEFINITIONTYPE port_def_type;
+ memset(&port_def_type, 0, sizeof(port_def_type));
+ port_def_type.nSize = sizeof(port_def_type);
+ port_def_type.nVersion.nVersion = OMX_VERSION;
+ port_def_type.nPortIndex = omx_rend_input_port; //omx_codec_input_port;
- if (!ChangeAudioPortConfig(false)){
- LogNT::getInstance()->info(TAG, "Change AudioPortConfig failed");
- video->UnlockClock();
- DeAllocateCodecsOMX();
- return 0;
- }
+ error = OMX_GetParameter(omx_aud_rend/*dec*/, OMX_IndexParamPortDefinition, &port_def_type);
-/* if (!video->ChangeComponentState(omx_aud_dec,OMX_StateIdle)) {
- LogNT::getInstance()->debug(TAG, "aud_dec ChangeComponentState");
- DeAllocateCodecsOMX();
- return 0;
- }*/
+ if (error != OMX_ErrorNone)
+ {
+ LogNT::getInstance()->debug(TAG, "Get OMX OMX_IndexParamPortDefinition failed {:#x}", error);
+ }
+ if (setportdef)
+ {
+ port_def_type.nBufferCountActual = 2;
+ port_def_type.nBufferSize = std::max(toi4(port_def_type.nBufferSize), 50000); // for transcoder important
+ error = OMX_SetParameter(omx_aud_rend/*dec*/, OMX_IndexParamPortDefinition, &port_def_type);
+ if (error != OMX_ErrorNone)
+ {
+ LogNT::getInstance()->debug(TAG, "Set OMX OMX_IndexParamPortDefinition failed {:#x}", error);
+ }
+ }
- if (!PrepareInputBufsOMX(true)) {
- video->UnlockClock();
- DeAllocateCodecsOMX();
- return 0;
- }
+ error = OMX_SendCommand(omx_aud_rend/*dec*/, OMX_CommandPortEnable, omx_rend_input_port/*codec*/, 0);
+ if (error != OMX_ErrorNone)
+ {
+ LogNT::getInstance()->debug(TAG, "Prepare Input bufs Send Command to enable port {:#x}", error);
+ return 0;
+ }
+ input_bufs_omx_mutex.lock();
+ for (unsigned int i = 0; i < port_def_type.nBufferCountActual; i++)
+ {
+ OMX_BUFFERHEADERTYPE* buf_head = NULL;
+ error = OMX_AllocateBuffer(omx_aud_rend/*dec*/, &buf_head, omx_rend_input_port/*codec*/, NULL, port_def_type.nBufferSize);
-/* error=OMX_SetupTunnel(omx_aud_dec,omx_codec_output_port,omx_aud_rend,omx_rend_input_port);
- if (error!=OMX_ErrorNone){
- LogNT::getInstance()->debug(TAG, "OMX_Setup tunnel dec to render failed {:#x}", error);
- video->UnlockClock();
- DeAllocateCodecsOMX();
- return 0;
- }*/
+ if (error != OMX_ErrorNone)
+ {
+ LogNT::getInstance()->debug(TAG, "Use OMX_AllocateBuffer failed {:#x}", error);
+ input_bufs_omx_mutex.unlock();
+ return 0;
+ }
+ input_bufs_omx_all.push_back(buf_head);
+ input_bufs_omx_free.push_back(buf_head);
+ }
+ omx_first_frame = true;
-/* if (!video->EnablePort(omx_aud_dec,omx_codec_output_port,false) || !video->EnablePort(omx_aud_rend,omx_rend_input_port,false)
- ) {
- LogNT::getInstance()->debug(TAG, "Enable Ports OMX codec rend failed");
- video->UnlockClock();
- DeAllocateCodecsOMX();
- return 0;
- }*/
+ firstsynched = false;
+ cur_input_buf_omx = NULL;
+ input_bufs_omx_mutex.unlock();
-/* if ( !video->CommandFinished(omx_aud_dec,OMX_CommandPortEnable,omx_codec_output_port)
- || !video->CommandFinished(omx_aud_rend,OMX_CommandPortEnable,omx_rend_input_port)) {
- video->UnlockClock();
- DeAllocateCodecsOMX();
- return 0;
- }*/
+ if (!video->CommandFinished(omx_aud_rend/*dec*/, OMX_CommandPortEnable, omx_rend_input_port /*codec*/))
+ {
+ return 0;
+ }
- if (!video->ChangeComponentState(omx_aud_rend,OMX_StateExecuting)) {
- LogNT::getInstance()->debug(TAG, "omx_aud_rend ChangeComponentState Execute");
- video->UnlockClock();
- DeAllocateCodecsOMX();
- return 0;
- }
+ return 1;
+}
+int AudioOMX::DestroyInputBufsOMX() //call with clock mutex locked
+{
+ OMX_ERRORTYPE error;
- video->UnlockClock();
- omx_running=true;
- setVolume(volume);
- doMuting();
- video->clockUnpause();
+ cur_input_buf_omx = NULL;
+ input_bufs_omx_mutex.lock();
+ for (u4 i = 0; i < input_bufs_omx_all.size(); i++)
+ {
+ error = OMX_FreeBuffer(omx_aud_rend/*dec*/, omx_rend_input_port/*codec*/, input_bufs_omx_all[i]);
- if (!video->setClockExecutingandRunning()) return 0;
+ if (error != OMX_ErrorNone)
+ {
+ LogNT::getInstance()->debug(TAG, "Use OMX_FreeBuffer failed {:#x}", error);
+ input_bufs_omx_mutex.unlock();
+ return 0;
+ }
+ }
- LogNT::getInstance()->info(TAG, "Allocate Codecs OMX finished");
+ input_bufs_omx_all.clear();
+ input_bufs_omx_free.clear();
+ input_bufs_omx_mutex.unlock();
- return 1;
+ return 1;
}
-int AudioOMX::PrepareInputBufsOMX(bool setportdef) //needs to be called with locvke omx clock mutex
+int AudioOMX::DestroyInputBufsOMXwhilePlaying() //call with clock mutex locked
{
- VideoOMX* video = static_cast<VideoOMX*>(Video::getInstance());
-
- OMX_ERRORTYPE error;
- OMX_PARAM_PORTDEFINITIONTYPE port_def_type;
- memset(&port_def_type,0,sizeof(port_def_type));
- port_def_type.nSize=sizeof(port_def_type);
- port_def_type.nVersion.nVersion=OMX_VERSION;
- port_def_type.nPortIndex=omx_rend_input_port;//omx_codec_input_port;
-
- error=OMX_GetParameter(omx_aud_rend/*dec*/,OMX_IndexParamPortDefinition, &port_def_type);
-
- if (error!=OMX_ErrorNone){
- LogNT::getInstance()->debug(TAG, "Get OMX OMX_IndexParamPortDefinition failed {:#x}", error);
- }
-
-
- if (setportdef) {
- port_def_type.nBufferCountActual=2;
- port_def_type.nBufferSize=std::max(toi4(port_def_type.nBufferSize),50000); // for transcoder important
-
- error=OMX_SetParameter(omx_aud_rend/*dec*/,OMX_IndexParamPortDefinition, &port_def_type);
-
- if (error!=OMX_ErrorNone){
- LogNT::getInstance()->debug(TAG, "Set OMX OMX_IndexParamPortDefinition failed {:#x}", error);
- }
- }
-
-
- error=OMX_SendCommand(omx_aud_rend/*dec*/,OMX_CommandPortEnable,omx_rend_input_port/*codec*/,0);
- if (error!=OMX_ErrorNone){
- LogNT::getInstance()->debug(TAG, "Prepare Input bufs Send Command to enable port {:#x}", error);
- return 0;
- }
-
- input_bufs_omx_mutex.lock();
- for (unsigned int i=0; i< port_def_type.nBufferCountActual;i++) {
- OMX_BUFFERHEADERTYPE *buf_head=NULL;
- error=OMX_AllocateBuffer(omx_aud_rend/*dec*/,&buf_head,omx_rend_input_port/*codec*/,NULL,port_def_type.nBufferSize);
- if (error!=OMX_ErrorNone){
- LogNT::getInstance()->debug(TAG, "Use OMX_AllocateBuffer failed {:#x}", error);
- input_bufs_omx_mutex.unlock();
- return 0;
- }
- input_bufs_omx_all.push_back(buf_head);
- input_bufs_omx_free.push_back(buf_head);
- }
- omx_first_frame=true;
-
- firstsynched=false;
- cur_input_buf_omx=NULL;
- input_bufs_omx_mutex.unlock();
-
- if (!video->CommandFinished(omx_aud_rend/*dec*/,OMX_CommandPortEnable,omx_rend_input_port /*codec*/)) {
- return 0;
- }
-
- return 1;
-}
+ //OMX_ERRORTYPE error;
-int AudioOMX::DestroyInputBufsOMX() //call with clock mutex locked
-{
- OMX_ERRORTYPE error;
-
- cur_input_buf_omx=NULL;
- input_bufs_omx_mutex.lock();
- for (u4 i=0; i< input_bufs_omx_all.size();i++) {
- error=OMX_FreeBuffer(omx_aud_rend/*dec*/,omx_rend_input_port/*codec*/,input_bufs_omx_all[i]);
- if (error!=OMX_ErrorNone){
- LogNT::getInstance()->debug(TAG, "Use OMX_FreeBuffer failed {:#x}", error);
- input_bufs_omx_mutex.unlock();
- return 0;
- }
-
- }
- input_bufs_omx_all.clear();
- input_bufs_omx_free.clear();
- input_bufs_omx_mutex.unlock();
-
- return 1;
-}
+ cur_input_buf_omx = NULL;
+ input_bufs_omx_mutex.lock();
-int AudioOMX::DestroyInputBufsOMXwhilePlaying() //call with clock mutex locked
-{
- //OMX_ERRORTYPE error;
-
- cur_input_buf_omx=NULL;
- input_bufs_omx_mutex.lock();
- while (input_bufs_omx_all.size()>0) {
- if (input_bufs_omx_free.size()>0) {
- // Destroy one buffer
- std::vector<OMX_BUFFERHEADERTYPE*>::iterator itty=input_bufs_omx_all.begin();
- OMX_BUFFERHEADERTYPE* cur_buf=input_bufs_omx_free.front();
- for (; itty!= input_bufs_omx_all.end();itty++) {
- if ((*itty)==cur_buf) {
- input_bufs_omx_all.erase(itty);
- input_bufs_omx_free.pop_front();
- break;
- }
- }
- } else {
- input_bufs_omx_mutex.unlock();
- MILLISLEEP(5);
- input_bufs_omx_mutex.lock();
- }
- }
-
- LogNT::getInstance()->debug(TAG, "DestroyInputBufsOMXwhilePlaying {} {}", input_bufs_omx_all.size(),input_bufs_omx_free.size());
- input_bufs_omx_mutex.unlock();
- return 1;
-}
+ while (input_bufs_omx_all.size() > 0)
+ {
+ if (input_bufs_omx_free.size() > 0)
+ {
+ // Destroy one buffer
+ std::vector<OMX_BUFFERHEADERTYPE*>::iterator itty = input_bufs_omx_all.begin();
+ OMX_BUFFERHEADERTYPE* cur_buf = input_bufs_omx_free.front();
+
+ for (; itty != input_bufs_omx_all.end(); itty++)
+ {
+ if ((*itty) == cur_buf)
+ {
+ input_bufs_omx_all.erase(itty);
+ input_bufs_omx_free.pop_front();
+ break;
+ }
+ }
+ }
+ else
+ {
+ input_bufs_omx_mutex.unlock();
+ MILLISLEEP(5);
+ input_bufs_omx_mutex.lock();
+ }
+ }
+ LogNT::getInstance()->debug(TAG, "DestroyInputBufsOMXwhilePlaying {} {}", input_bufs_omx_all.size(), input_bufs_omx_free.size());
+ input_bufs_omx_mutex.unlock();
+ return 1;
+}
int AudioOMX::DeAllocateCodecsOMX()
{
OMX_ERRORTYPE error;
- omx_running=false;
+ omx_running = false;
VideoOMX* video = static_cast<VideoOMX*>(Video::getInstance());
LogNT::getInstance()->debug(TAG, "enter deallocatecodecsomx");
+ LogNT::getInstance()->debug(TAG, "deallocatecodecsomx mark 1");
- LogNT::getInstance()->debug(TAG, "deallocatecodecsomx mark 1");
- if (cur_input_buf_omx) {
- cur_input_buf_omx->nFlags|=OMX_BUFFERFLAG_EOS;
- error=video->ProtOMXEmptyThisBuffer(omx_aud_rend/*dec*/,cur_input_buf_omx);
- if (error!=OMX_ErrorNone) {
- LogNT::getInstance()->debug(TAG, "OMX_EmptyThisBuffer 6 failed {:#x}", error);
- }
-
- cur_input_buf_omx=NULL;//write out old data
- }
- LogNT::getInstance()->debug(TAG, "deallocatecodecsomx mark 2");
-
- video->LockClock();
- if (omx_aud_rend/*dec*/) {
- // first stop the omx elements
- /* if (!video->ChangeComponentState(omx_aud_dec,OMX_StateIdle)) {
- LogNT::getInstance()->debug(TAG, "aud_dec ChangeComponentState");
- }*/
- LogNT::getInstance()->debug(TAG, "deallocatecodecsomx mark 3");
-
- video->UnlockClock();
- LogNT::getInstance()->debug(TAG, "deallocatecodecsomx mark 4");
- video->idleClock();
- LogNT::getInstance()->debug(TAG, "deallocatecodecsomx mark 5");
- video->LockClock();
-
- if (!video->ChangeComponentState(omx_aud_rend,OMX_StateIdle)) {
- LogNT::getInstance()->debug(TAG, "aud_rend ChangeComponentState");
- }
-
- // TODO proper deinit sequence
- // first flush all buffers
-
- error=OMX_SendCommand(omx_aud_rend,OMX_CommandFlush, omx_rend_input_port, NULL);
- if (error!=OMX_ErrorNone) {
- LogNT::getInstance()->debug(TAG, "OMX_Flush rend in failed {:#x}", error);
-
- }
-
- /* error=OMX_SendCommand(omx_aud_dec,OMX_CommandFlush, omx_codec_input_port, NULL);
- if (error!=OMX_ErrorNone){
- LogNT::getInstance()->debug(TAG, "OMX_Flush codec out failed {:#x}", error);
+ if (cur_input_buf_omx)
+ {
+ cur_input_buf_omx->nFlags |= OMX_BUFFERFLAG_EOS;
+ error = video->ProtOMXEmptyThisBuffer(omx_aud_rend/*dec*/, cur_input_buf_omx);
- }*/
+ if (error != OMX_ErrorNone)
+ {
+ LogNT::getInstance()->debug(TAG, "OMX_EmptyThisBuffer 6 failed {:#x}", error);
+ }
+ cur_input_buf_omx = NULL; //write out old data
+ }
- /* if (!video->CommandFinished(omx_aud_dec,OMX_CommandFlush,omx_codec_input_port)) {
- LogNT::getInstance()->debug(TAG, "flush cmd codec input failed");
- }*/
+ LogNT::getInstance()->debug(TAG, "deallocatecodecsomx mark 2");
+ video->LockClock();
+ if (omx_aud_rend/*dec*/)
+ {
+ // first stop the omx elements
+ /* if (!video->ChangeComponentState(omx_aud_dec,OMX_StateIdle)) {
+ LogNT::getInstance()->debug(TAG, "aud_dec ChangeComponentState");
+ }*/
+ LogNT::getInstance()->debug(TAG, "deallocatecodecsomx mark 3");
+
+ video->UnlockClock();
+ LogNT::getInstance()->debug(TAG, "deallocatecodecsomx mark 4");
+ video->idleClock();
+ LogNT::getInstance()->debug(TAG, "deallocatecodecsomx mark 5");
+ video->LockClock();
+
+ if (!video->ChangeComponentState(omx_aud_rend, OMX_StateIdle))
+ {
+ LogNT::getInstance()->debug(TAG, "aud_rend ChangeComponentState");
+ }
- error=OMX_SendCommand(omx_clock,OMX_CommandFlush, omx_clock_output_port, NULL);
- if (error!=OMX_ErrorNone){
- LogNT::getInstance()->debug(TAG, "OMX_Flush clock out failed {:#x}", error);
+ // TODO proper deinit sequence
+ // first flush all buffers
- }
+ error = OMX_SendCommand(omx_aud_rend, OMX_CommandFlush, omx_rend_input_port, NULL);
- error=OMX_SendCommand(omx_aud_rend,OMX_CommandFlush, omx_rend_clock_port, NULL);
- if (error!=OMX_ErrorNone){
- LogNT::getInstance()->debug(TAG, "OMX_Flush rend clock failed {:#x}", error);
+ if (error != OMX_ErrorNone)
+ {
+ LogNT::getInstance()->debug(TAG, "OMX_Flush rend in failed {:#x}", error);
+ }
- }
- LogNT::getInstance()->debug(TAG, "deallocatecodecsomx mark 6");
+ /* error=OMX_SendCommand(omx_aud_dec,OMX_CommandFlush, omx_codec_input_port, NULL);
+ if (error!=OMX_ErrorNone){
+ LogNT::getInstance()->debug(TAG, "OMX_Flush codec out failed {:#x}", error);
- if (!video->CommandFinished(omx_clock,OMX_CommandFlush,omx_clock_output_port) ||
- !video->CommandFinished(omx_aud_rend,OMX_CommandFlush,omx_rend_clock_port)) {
- LogNT::getInstance()->debug(TAG, "flush cmd clock shed failed");
- }
+ }*/
- DestroyInputBufsOMX(); //We have to make sure that no buffers are in use
- LogNT::getInstance()->debug(TAG, "deallocatecodecsomx mark 6a");
- DeinitDecoderLibAV();
- LogNT::getInstance()->debug(TAG, "deallocatecodecsomx mark 7");
- //todo flushing
- if (!video->DisablePort(omx_aud_rend,omx_rend_input_port,true)) {
- LogNT::getInstance()->debug(TAG, "Disable Tunnel Port failed 1");
- }
+ /* if (!video->CommandFinished(omx_aud_dec,OMX_CommandFlush,omx_codec_input_port)) {
+ LogNT::getInstance()->debug(TAG, "flush cmd codec input failed");
+ }*/
- /* if (!video->DisablePort(omx_aud_dec,omx_codec_output_port,true)) {
- LogNT::getInstance()->debug(TAG, "Disable Tunnel Port failed 6");
- }
- if (!video->DisablePort(omx_aud_dec,omx_codec_input_port,true)) {
- LogNT::getInstance()->debug(TAG, "Disable Tunnel Port failed 7");
- }*/
+ error = OMX_SendCommand(omx_clock, OMX_CommandFlush, omx_clock_output_port, NULL);
+ if (error != OMX_ErrorNone)
+ {
+ LogNT::getInstance()->debug(TAG, "OMX_Flush clock out failed {:#x}", error);
+ }
- if (!video->DisablePort(omx_aud_rend,omx_rend_clock_port,true)) {
- LogNT::getInstance()->debug(TAG, "Disable Tunnel Port failed 4");
- }
+ error = OMX_SendCommand(omx_aud_rend, OMX_CommandFlush, omx_rend_clock_port, NULL);
+ if (error != OMX_ErrorNone)
+ {
+ LogNT::getInstance()->debug(TAG, "OMX_Flush rend clock failed {:#x}", error);
+ }
- if (!video->DisablePort(omx_clock,omx_clock_output_port,true)) {
- LogNT::getInstance()->debug(TAG, "Disable Tunnel Port failed 5");
- }
+ LogNT::getInstance()->debug(TAG, "deallocatecodecsomx mark 6");
+ if (!video->CommandFinished(omx_clock, OMX_CommandFlush, omx_clock_output_port) ||
+ !video->CommandFinished(omx_aud_rend, OMX_CommandFlush, omx_rend_clock_port))
+ {
+ LogNT::getInstance()->debug(TAG, "flush cmd clock shed failed");
+ }
+ DestroyInputBufsOMX(); //We have to make sure that no buffers are in use
+ LogNT::getInstance()->debug(TAG, "deallocatecodecsomx mark 6a");
+ DeinitDecoderLibAV();
+ LogNT::getInstance()->debug(TAG, "deallocatecodecsomx mark 7");
- /* error=OMX_SetupTunnel(omx_aud_dec,omx_codec_output_port,NULL,NULL);
- if (error!=OMX_ErrorNone) {
- LogNT::getInstance()->debug(TAG, "OMX_Setup tunnel teardown failed {:#x}", error);
+ //todo flushing
+ if (!video->DisablePort(omx_aud_rend, omx_rend_input_port, true))
+ {
+ LogNT::getInstance()->debug(TAG, "Disable Tunnel Port failed 1");
+ }
- }*/
+ /* if (!video->DisablePort(omx_aud_dec,omx_codec_output_port,true)) {
+ LogNT::getInstance()->debug(TAG, "Disable Tunnel Port failed 6");
+ }
+ if (!video->DisablePort(omx_aud_dec,omx_codec_input_port,true)) {
+ LogNT::getInstance()->debug(TAG, "Disable Tunnel Port failed 7");
+ }*/
- error=OMX_SetupTunnel(omx_aud_rend,omx_rend_input_port,NULL,0);
- if (error!=OMX_ErrorNone) {
- LogNT::getInstance()->debug(TAG, "OMX_Setup tunnel teardown failed {:#x}", error);
+ if (!video->DisablePort(omx_aud_rend, omx_rend_clock_port, true))
+ {
+ LogNT::getInstance()->debug(TAG, "Disable Tunnel Port failed 4");
+ }
- }
+ if (!video->DisablePort(omx_clock, omx_clock_output_port, true))
+ {
+ LogNT::getInstance()->debug(TAG, "Disable Tunnel Port failed 5");
+ }
- error=OMX_SetupTunnel(omx_clock,omx_clock_output_port,NULL,0);
- if (error!=OMX_ErrorNone) {
- LogNT::getInstance()->debug(TAG, "OMX_Setup tunnel teardown failed {:#x}", error);
+ /* error=OMX_SetupTunnel(omx_aud_dec,omx_codec_output_port,NULL,NULL);
+ if (error!=OMX_ErrorNone) {
+ LogNT::getInstance()->debug(TAG, "OMX_Setup tunnel teardown failed {:#x}", error);
+ }*/
- }
+ error = OMX_SetupTunnel(omx_aud_rend, omx_rend_input_port, NULL, 0);
+ if (error != OMX_ErrorNone)
+ {
+ LogNT::getInstance()->debug(TAG, "OMX_Setup tunnel teardown failed {:#x}", error);
+ }
- error=OMX_SetupTunnel(omx_aud_rend,omx_rend_clock_port,NULL,0);
- if (error!=OMX_ErrorNone) {
- LogNT::getInstance()->debug(TAG, "OMX_Setup tunnel teardown failed {:#x}", error);
+ error = OMX_SetupTunnel(omx_clock, omx_clock_output_port, NULL, 0);
+ if (error != OMX_ErrorNone)
+ {
+ LogNT::getInstance()->debug(TAG, "OMX_Setup tunnel teardown failed {:#x}", error);
+ }
- }
- LogNT::getInstance()->debug(TAG, "deallocatecodecsomx mark 8");
+ error = OMX_SetupTunnel(omx_aud_rend, omx_rend_clock_port, NULL, 0);
+ if (error != OMX_ErrorNone)
+ {
+ LogNT::getInstance()->debug(TAG, "OMX_Setup tunnel teardown failed {:#x}", error);
+ }
+ LogNT::getInstance()->debug(TAG, "deallocatecodecsomx mark 8");
- //error=OMX_FreeHandle(omx_aud_dec);
- error=OMX_FreeHandle(omx_aud_rend);
- video->UnlockClock();
- video->destroyClock();
- omx_aud_rend/*dec*/=NULL;
- if (error!=OMX_ErrorNone) {
- LogNT::getInstance()->debug(TAG, "FreeHandle failed {}", error);
- }
- } else {
+ //error=OMX_FreeHandle(omx_aud_dec);
+ error = OMX_FreeHandle(omx_aud_rend);
+ video->UnlockClock();
+ video->destroyClock();
+ omx_aud_rend/*dec*/ = NULL;
- video->UnlockClock();
- DeinitDecoderLibAV();
- }
- LogNT::getInstance()->debug(TAG, "leave deallocate codecs OMX");
+ if (error != OMX_ErrorNone)
+ {
+ LogNT::getInstance()->debug(TAG, "FreeHandle failed {}", error);
+ }
+ }
+ else
+ {
+ video->UnlockClock();
+ DeinitDecoderLibAV();
+ }
- return 1;
+ LogNT::getInstance()->debug(TAG, "leave deallocate codecs OMX");
+ return 1;
}
-
-
int AudioOMX::stop()
{
if (!initted) return 0;
return 1;
}
-int AudioOMX::mute() {
- if (!initted)
- return 0;
- LogNT::getInstance()->debug(TAG, "MUTE MUTE MUTE");
- VideoOMX* vw = static_cast<VideoOMX*>(Video::getInstance());
- vw->LockClock();
- if (omx_running) {
-
- OMX_AUDIO_CONFIG_MUTETYPE amute;
- memset(&amute, 0, sizeof(amute));
- amute.nSize = sizeof(amute);
- amute.nVersion.nVersion = OMX_VERSION;
- amute.nPortIndex = omx_rend_input_port;
- amute.bMute = OMX_TRUE;
- OMX_ERRORTYPE error= OMX_SetParameter(omx_aud_rend, OMX_IndexConfigAudioMute,
- &amute);
- if (error != OMX_ErrorNone) {
- LogNT::getInstance()->debug(TAG,
- "Set OMX_IndexConfigAudioMute failed {:#x} {}", error,
- omx_rend_input_port);
- vw->UnlockClock();
- return 0;
- }
-
- }
- vw->UnlockClock();
-
- muted = 1;
- return 1;
+int AudioOMX::mute()
+{
+ if (!initted) return 0;
+
+ LogNT::getInstance()->debug(TAG, "MUTE MUTE MUTE");
+ VideoOMX* vw = static_cast<VideoOMX*>(Video::getInstance());
+ vw->LockClock();
+
+ if (omx_running)
+ {
+ OMX_AUDIO_CONFIG_MUTETYPE amute;
+ memset(&amute, 0, sizeof(amute));
+ amute.nSize = sizeof(amute);
+ amute.nVersion.nVersion = OMX_VERSION;
+ amute.nPortIndex = omx_rend_input_port;
+ amute.bMute = OMX_TRUE;
+ OMX_ERRORTYPE error = OMX_SetParameter(omx_aud_rend, OMX_IndexConfigAudioMute, &amute);
+
+ if (error != OMX_ErrorNone)
+ {
+ LogNT::getInstance()->debug(TAG,
+ "Set OMX_IndexConfigAudioMute failed {:#x} {}", error, omx_rend_input_port);
+ vw->UnlockClock();
+ return 0;
+ }
+ }
+
+ vw->UnlockClock();
+
+ muted = 1;
+ return 1;
}
int AudioOMX::unMute()
LogNT::getInstance()->debug(TAG, "MUTE OFF OFF OFF");
VideoOMX* vw = static_cast<VideoOMX*>(Video::getInstance());
vw->LockClock();
- if (omx_running) {
-
- OMX_AUDIO_CONFIG_MUTETYPE amute;
- memset(&amute, 0, sizeof(amute));
- amute.nSize = sizeof(amute);
- amute.nVersion.nVersion = OMX_VERSION;
- amute.nPortIndex = omx_rend_input_port;
- amute.bMute = OMX_FALSE;
- OMX_ERRORTYPE error = OMX_SetParameter(omx_aud_rend, OMX_IndexConfigAudioMute,
- &amute);
- if (error != OMX_ErrorNone) {
- LogNT::getInstance()->debug(TAG,
- "Set OMX_IndexConfigAudioMute failed {:#x} {}", error,
- omx_rend_input_port);
- vw->UnlockClock();
- return 0;
- }
- }
- vw->UnlockClock();
+ if (omx_running)
+ {
+ OMX_AUDIO_CONFIG_MUTETYPE amute;
+ memset(&amute, 0, sizeof(amute));
+ amute.nSize = sizeof(amute);
+ amute.nVersion.nVersion = OMX_VERSION;
+ amute.nPortIndex = omx_rend_input_port;
+ amute.bMute = OMX_FALSE;
+ OMX_ERRORTYPE error = OMX_SetParameter(omx_aud_rend, OMX_IndexConfigAudioMute, &amute);
+
+ if (error != OMX_ErrorNone)
+ {
+ LogNT::getInstance()->debug(TAG, "Set OMX_IndexConfigAudioMute failed {:#x} {}", error, omx_rend_input_port);
+ vw->UnlockClock();
+ return 0;
+ }
+ }
+
+ vw->UnlockClock();
muted = 0;
return 1;
int AudioOMX::pause()
{
- if (!initted) return 0;
- VideoOMX* vw = static_cast<VideoOMX*>(Video::getInstance());
- vw->clockPause();
- return 1;
+ if (!initted) return 0;
+
+ VideoOMX* vw = static_cast<VideoOMX*>(Video::getInstance());
+ vw->clockPause();
+ return 1;
}
int AudioOMX::unPause()
{
if (!initted) return 0;
+
VideoOMX* vw = static_cast<VideoOMX*>(Video::getInstance());
vw->clockUnpause();
return 1;
int AudioOMX::reset()
{
if (!initted) return 0;
-//test();
+
+ //test();
LogNT::getInstance()->debug(TAG, "reset called");
DeAllocateCodecsOMX();
-// if (ioctl(fdAudio, AV_SET_AUD_RESET, 0x11) != 0) return 0;
-// LogNT::getInstance()->debug(TAG, "reset back");
- // if (ioctl(fdAudio, AV_SET_AUD_PLAY, 0) != 0) return 0;
+ // if (ioctl(fdAudio, AV_SET_AUD_RESET, 0x11) != 0) return 0;
+ // LogNT::getInstance()->debug(TAG, "reset back");
+ // if (ioctl(fdAudio, AV_SET_AUD_PLAY, 0) != 0) return 0;
doMuting();
return 1;
// parameter: 0 for silence, 20 for full
if ((tvolume < 0) || (tvolume > 20)) return 0;
-// volume = 2 * (20 - volume);
-// Right, that one was rubbish... 0-10 were almost
-// inaudible, 11-20 did what should have been done
-// over the whole 0-20 range
- volume=tvolume;
+ // volume = 2 * (20 - volume);
+ // Right, that one was rubbish... 0-10 were almost
+ // inaudible, 11-20 did what should have been done
+ // over the whole 0-20 range
+ volume = tvolume;
VideoOMX* vw = static_cast<VideoOMX*>(Video::getInstance());
vw->LockClock();
- if (omx_running) {
-
- OMX_AUDIO_CONFIG_VOLUMETYPE avol;
- memset(&avol, 0, sizeof(avol));
- avol.nSize = sizeof(avol);
- avol.nVersion.nVersion = OMX_VERSION;
- avol.nPortIndex = omx_rend_input_port;
- avol.bLinear=OMX_FALSE;
- avol.sVolume.nValue =(volume-20)*200;
- OMX_ERRORTYPE error = OMX_SetParameter(omx_aud_rend, OMX_IndexConfigAudioVolume,
- &avol);
- if (error != OMX_ErrorNone) {
- LogNT::getInstance()->debug(TAG,
- "Set OMX_IndexConfigAudioVolume failed {:#x} {}", error,
- omx_rend_input_port);
- vw->UnlockClock();
- return 0;
- }
+ if (omx_running)
+ {
+ OMX_AUDIO_CONFIG_VOLUMETYPE avol;
+ memset(&avol, 0, sizeof(avol));
+ avol.nSize = sizeof(avol);
+ avol.nVersion.nVersion = OMX_VERSION;
+ avol.nPortIndex = omx_rend_input_port;
+ avol.bLinear = OMX_FALSE;
+ avol.sVolume.nValue = (volume - 20) * 200;
+ OMX_ERRORTYPE error = OMX_SetParameter(omx_aud_rend, OMX_IndexConfigAudioVolume, &avol);
+
+ if (error != OMX_ErrorNone)
+ {
+ LogNT::getInstance()->debug(TAG, "Set OMX_IndexConfigAudioVolume failed {:#x} {}", error, omx_rend_input_port);
+ vw->UnlockClock();
+ return 0;
+ }
}
+
vw->UnlockClock();
return 1;
#ifdef DEV
int AudioOMX::test()
{
-// u8 stc = 0;
-// return ioctl(fdAudio, AV_SET_AUD_STC, &stc);
+ // u8 stc = 0;
+ // return ioctl(fdAudio, AV_SET_AUD_STC, &stc);
-/* aud_sync_parms_t a;
- a.parm1 = 0;
- a.parm2 = 0;
-*/
-// int b = ioctl(fdAudio, AV_SET_AUD_DISABLE_SYNC, &a);
+ /* aud_sync_parms_t a;
+ a.parm1 = 0;
+ a.parm2 = 0;
+ */
+ // int b = ioctl(fdAudio, AV_SET_AUD_DISABLE_SYNC, &a);
/*OK*/ //printf("Audio sync disable = %i\n", b);
return 1;
-
-
}
#endif
-unsigned int AudioOMX::AdvanceMpAudioSync(const u1 *data,unsigned int size,unsigned int *framesize)
+unsigned int AudioOMX::AdvanceMpAudioSync(const u1* data, unsigned int size, unsigned int* framesize)
{
- if (size<=2) return size; // silly;
- unsigned int atest=0;
- *framesize=0;
- //inspired by libav parsing code
- while (atest+1<size) {
- if (data[atest]==0xFF && (data[atest+1] &0xe0)==0xe0) {
- if ((data[atest+1] & 0x18) == 0x08) {atest++;continue;} //sanity check: mpeg version ID 01 -> reserved
- //sanity check inspired by libav
-
-
- const int sample_rates[4]={44100,48000,32000,0};
- const short bitrate_tab[2][3][15] = { { { 0, 32, 64, 96, 128, 160,
- 192, 224, 256, 288, 320, 352, 384, 416, 448 }, { 0, 32, 48,
- 56, 64, 80, 96, 112, 128, 160, 192, 224, 256, 320, 384 }, {
- 0, 32, 40, 48, 56, 64, 80, 96, 112, 128, 160, 192, 224,
- 256, 320 } }, { { 0, 32, 48, 56, 64, 80, 96, 112, 128, 144,
- 160, 176, 192, 224, 256 }, { 0, 8, 16, 24, 32, 40, 48, 56,
- 64, 80, 96, 112, 128, 144, 160 }, { 0, 8, 16, 24, 32, 40,
- 48, 56, 64, 80, 96, 112, 128, 144, 160 } } };
- int lsf=0;
- int mpeg2=0;
- int layer=4-((data[atest+1]&0x06)>>1);
- if (layer==4) {atest++;continue;} //sanity check
-
- int bitrate_index=(data[atest+2]&0xf0)>>4;
- if (bitrate_index==0x0f || bitrate_index==0x0) {atest++;continue;} //sanity check
-
- int samplerate_index=(data[atest+2]&0x0C)>>2;
- if (samplerate_index==0x03) {atest++;continue;} //sanity check
-
- int padding=(data[atest+2]&2)>>1;
- if (0x10 & data[atest+1]) {
- lsf=((data[atest+1]) &0x8)?0:1;
- mpeg2=0;
- } else {
- lsf=1;
- mpeg2=1;
- }
- int sample_rate=sample_rates[ samplerate_index]>>(lsf+mpeg2);
- int frame_size=0;
- int temp_frame_size=bitrate_tab[lsf][layer - 1][bitrate_index];
- if (layer==1) {
- frame_size=(temp_frame_size*12000)/sample_rate;
- frame_size=(frame_size+padding)*4;
- } else if (layer==2) {
- frame_size=(temp_frame_size*144000)/sample_rate;
- frame_size=frame_size+padding;
- } else {
- frame_size=(temp_frame_size*144000)/(sample_rate<<lsf);
- frame_size=frame_size+padding;
- }
- unsigned int sameheadertest=(data[atest]<<24)|(data[atest+1]<<16) |(data[atest+2]<<8);
- const unsigned mask=(0xffe00000 | (3 << 17) | (3 << 10) | (3 << 19)); // from libav
- if (!mp3sameheader) {
- mp3sameheader=sameheadertest;
- mp3sameheadercount=2;
- }
- if ((mp3sameheader& mask)== (sameheadertest &mask)) mp3sameheadercount++;
- else mp3sameheadercount=0;
- mp3sameheader=sameheadertest;
-
- //LogNT::getInstance()->debug(TAG, "FRAME: {} {} {} {} {} {} {}",lsf,layer,bitrate_index,sample_rate,padding,temp_frame_size, frame_size);
- //LogNT::getInstance()->debug(TAG, "FRAME DIAG: {:#x} {:#x} {:#x} {}",data[atest],data[atest+1],data[atest+2],mp3sameheadercount);
-
- if (mp3sameheadercount>4) {
- *framesize=frame_size;
- return atest; // probably FrameSync
- } //skip it if the header changes too frequently
- }
- atest++;
- }
- return size;
+ if (size <= 2) return size; // silly;
+
+ unsigned int atest = 0;
+ *framesize = 0;
+
+ //inspired by libav parsing code
+ while (atest + 1 < size)
+ {
+ if (data[atest] == 0xFF && (data[atest + 1] & 0xe0) == 0xe0)
+ {
+ if ((data[atest + 1] & 0x18) == 0x08) {atest++; continue;} //sanity check: mpeg version ID 01 -> reserved
+
+ //sanity check inspired by libav
+
+
+ const int sample_rates[4] = {44100, 48000, 32000, 0};
+ const short bitrate_tab[2][3][15] = { { {
+ 0, 32, 64, 96, 128, 160,
+ 192, 224, 256, 288, 320, 352, 384, 416, 448
+ }, {
+ 0, 32, 48,
+ 56, 64, 80, 96, 112, 128, 160, 192, 224, 256, 320, 384
+ }, {
+ 0, 32, 40, 48, 56, 64, 80, 96, 112, 128, 160, 192, 224,
+ 256, 320
+ }
+ }, { {
+ 0, 32, 48, 56, 64, 80, 96, 112, 128, 144,
+ 160, 176, 192, 224, 256
+ }, {
+ 0, 8, 16, 24, 32, 40, 48, 56,
+ 64, 80, 96, 112, 128, 144, 160
+ }, {
+ 0, 8, 16, 24, 32, 40,
+ 48, 56, 64, 80, 96, 112, 128, 144, 160
+ }
+ }
+ };
+ int lsf = 0;
+ int mpeg2 = 0;
+ int layer = 4 - ((data[atest + 1] & 0x06) >> 1);
+
+ if (layer == 4) {atest++; continue;} //sanity check
+
+ int bitrate_index = (data[atest + 2] & 0xf0) >> 4;
+
+ if (bitrate_index == 0x0f || bitrate_index == 0x0) {atest++; continue;} //sanity check
+
+ int samplerate_index = (data[atest + 2] & 0x0C) >> 2;
+
+ if (samplerate_index == 0x03) {atest++; continue;} //sanity check
+
+ int padding = (data[atest + 2] & 2) >> 1;
+
+ if (0x10 & data[atest + 1])
+ {
+ lsf = ((data[atest + 1]) & 0x8) ? 0 : 1;
+ mpeg2 = 0;
+ }
+ else
+ {
+ lsf = 1;
+ mpeg2 = 1;
+ }
+
+ int sample_rate = sample_rates[ samplerate_index] >> (lsf + mpeg2);
+ int frame_size = 0;
+ int temp_frame_size = bitrate_tab[lsf][layer - 1][bitrate_index];
+
+ if (layer == 1)
+ {
+ frame_size = (temp_frame_size * 12000) / sample_rate;
+ frame_size = (frame_size + padding) * 4;
+ }
+ else if (layer == 2)
+ {
+ frame_size = (temp_frame_size * 144000) / sample_rate;
+ frame_size = frame_size + padding;
+ }
+ else
+ {
+ frame_size = (temp_frame_size * 144000) / (sample_rate << lsf);
+ frame_size = frame_size + padding;
+ }
+
+ unsigned int sameheadertest = (data[atest] << 24) | (data[atest + 1] << 16) | (data[atest + 2] << 8);
+ const unsigned mask = (0xffe00000 | (3 << 17) | (3 << 10) | (3 << 19)); // from libav
+
+ if (!mp3sameheader)
+ {
+ mp3sameheader = sameheadertest;
+ mp3sameheadercount = 2;
+ }
+
+ if ((mp3sameheader & mask) == (sameheadertest & mask)) mp3sameheadercount++;
+ else mp3sameheadercount = 0;
+
+ mp3sameheader = sameheadertest;
+
+ //LogNT::getInstance()->debug(TAG, "FRAME: {} {} {} {} {} {} {}",lsf,layer,bitrate_index,sample_rate,padding,temp_frame_size, frame_size);
+ //LogNT::getInstance()->debug(TAG, "FRAME DIAG: {:#x} {:#x} {:#x} {}",data[atest],data[atest+1],data[atest+2],mp3sameheadercount);
+
+ if (mp3sameheadercount > 4)
+ {
+ *framesize = frame_size;
+ return atest; // probably FrameSync
+ } //skip it if the header changes too frequently
+ }
+
+ atest++;
+ }
+
+ return size;
}
-unsigned int AudioOMX::AdvanceAc3AudioSync(const u1 *data,unsigned int size,unsigned int *framesize)
+unsigned int AudioOMX::AdvanceAc3AudioSync(const u1* data, unsigned int size, unsigned int* framesize)
{
- if (size<=4) return size; // silly;
- const int frm_size_tab[] = { 64, 64, 80, 80, 96, 96, 112, 112, 128, 128,
- 160, 160, 192, 192, 224, 224, 256, 256, 320, 320, 384, 384, 448,
- 448, 512, 512, 640, 640, 768, 768, 896, 896, 1024, 1024, 1152,
- 1152, 1280, 1280, };
- unsigned int atest=0;
- *framesize=20000; //if we do not find a start code do not decompress
- while (atest+4<size) {
- if (data[atest]==0x0B && data[atest+1]==0x77) {
- // now figure out the length of the frame
- unsigned char code=data[atest+4];
- unsigned char fscod=(code& 0xC0)>>6;
- unsigned char frmsize=(code &0x3f);
- if (fscod!=0) LogNT::getInstance()->debug(TAG, "warning we only support 48 KHz sampling rate");
- *framesize=frm_size_tab[frmsize]*2;
- return atest; // probably FrameSync
- }
- atest++;
- }
- return size;
+ if (size <= 4) return size; // silly;
+
+ const int frm_size_tab[] = { 64, 64, 80, 80, 96, 96, 112, 112, 128, 128,
+ 160, 160, 192, 192, 224, 224, 256, 256, 320, 320, 384, 384, 448,
+ 448, 512, 512, 640, 640, 768, 768, 896, 896, 1024, 1024, 1152,
+ 1152, 1280, 1280,
+ };
+ unsigned int atest = 0;
+ *framesize = 20000; //if we do not find a start code do not decompress
+
+ while (atest + 4 < size)
+ {
+ if (data[atest] == 0x0B && data[atest + 1] == 0x77)
+ {
+ // now figure out the length of the frame
+ unsigned char code = data[atest + 4];
+ unsigned char fscod = (code & 0xC0) >> 6;
+ unsigned char frmsize = (code & 0x3f);
+
+ if (fscod != 0) LogNT::getInstance()->debug(TAG, "warning we only support 48 KHz sampling rate");
+
+ *framesize = frm_size_tab[frmsize] * 2;
+ return atest; // probably FrameSync
+ }
+
+ atest++;
+ }
+
+ return size;
}
-unsigned int AudioOMX::AdvanceAacLatmAudioSync(const u1 *data,unsigned int size,unsigned int *framesize)
+unsigned int AudioOMX::AdvanceAacLatmAudioSync(const u1* data, unsigned int size, unsigned int* framesize)
{
- if (size<=4) return size; // silly;
- unsigned int atest=0;
- *framesize=20000; //if we do not find a start code do not decompress
- while (atest+4<size) {
- if (data[atest] ==0x56 && (data[atest+1]& 0xe0)==0xe0) {
- // now figure out the length of the frame
- unsigned int length= ((0x1f & data[atest+1])<<8) | data[atest+2];
- *framesize=length+3;
- return atest; // probably FrameSync
- }
- atest++;
- }
- return size;
+ if (size <= 4) return size; // silly;
+
+ unsigned int atest = 0;
+ *framesize = 20000; //if we do not find a start code do not decompress
+
+ while (atest + 4 < size)
+ {
+ if (data[atest] == 0x56 && (data[atest + 1] & 0xe0) == 0xe0)
+ {
+ // now figure out the length of the frame
+ unsigned int length = ((0x1f & data[atest + 1]) << 8) | data[atest + 2];
+ *framesize = length + 3;
+ return atest; // probably FrameSync
+ }
+
+ atest++;
+ }
+
+ return size;
}
packet = mplist.front();
}
-u4 AudioOMX::DeliverMediaSample(u1* buffer, u4* samplepos) {
- DeliverMediaPacket(packet, buffer, samplepos);
- if (*samplepos == packet.length) {
- *samplepos = 0;
- return 1;
- } else
- return 0;
-}
+u4 AudioOMX::DeliverMediaSample(u1* buffer, u4* samplepos)
+{
+ DeliverMediaPacket(packet, buffer, samplepos);
+ if (*samplepos == packet.length)
+ {
+ *samplepos = 0;
+ return 1;
+ }
+ else
+ return 0;
+}
-long long AudioOMX::correctAudioLatency(long long pts,int addsamples,int srate)
+long long AudioOMX::correctAudioLatency(long long pts, int addsamples, int srate)
{
- VideoOMX* video = static_cast<VideoOMX*>(Video::getInstance());
- video->LockClock();
- OMX_PARAM_U32TYPE audio_lat;
- OMX_ERRORTYPE error;
- memset(&audio_lat, 0, sizeof(audio_lat));
- audio_lat.nSize = sizeof(audio_lat);
- audio_lat.nVersion.nVersion = OMX_VERSION;
- audio_lat.nPortIndex = omx_rend_input_port;
-
- error = OMX_GetConfig(omx_aud_rend, OMX_IndexConfigAudioRenderingLatency,
- &audio_lat);
- video->UnlockClock();
- if (error != OMX_ErrorNone) {
- LogNT::getInstance()->debug(TAG,
- "Init OMX_IndexConfigAudioRenderingLatencyfailed {:#x} {}", error,
- omx_rend_input_port);
- return pts; // no correction in case of error
- }
- /*LogNT::getInstance()->debug(TAG, "Current audio latency {}",
- audio_lat.nU32);*/
-
- long long workpts=0;
- workpts+=addsamples;
- workpts-=audio_lat.nU32;
- workpts*=10LL*1000LL*1000LL;
- workpts=workpts/((long long)srate); //one second /samplerate
- workpts+=pts;
-
- return workpts;
+ VideoOMX* video = static_cast<VideoOMX*>(Video::getInstance());
+ video->LockClock();
+ OMX_PARAM_U32TYPE audio_lat;
+ OMX_ERRORTYPE error;
+ memset(&audio_lat, 0, sizeof(audio_lat));
+ audio_lat.nSize = sizeof(audio_lat);
+ audio_lat.nVersion.nVersion = OMX_VERSION;
+ audio_lat.nPortIndex = omx_rend_input_port;
+
+ error = OMX_GetConfig(omx_aud_rend, OMX_IndexConfigAudioRenderingLatency,
+ &audio_lat);
+ video->UnlockClock();
+
+ if (error != OMX_ErrorNone)
+ {
+ LogNT::getInstance()->debug(TAG, "Init OMX_IndexConfigAudioRenderingLatencyfailed {:#x} {}", error, omx_rend_input_port);
+ return pts; // no correction in case of error
+ }
+
+ /*LogNT::getInstance()->debug(TAG, "Current audio latency {}",
+ audio_lat.nU32);*/
+
+ long long workpts = 0;
+ workpts += addsamples;
+ workpts -= audio_lat.nU32;
+ workpts *= 10LL * 1000LL * 1000LL;
+ workpts = workpts / ((long long)srate); //one second /samplerate
+ workpts += pts;
+
+ return workpts;
}
bool AudioOMX::DrainTargetBufferFull()
{
- //Check, if we have OMX output buffers
- bool full;
- input_bufs_omx_mutex.lock();
- full=(input_bufs_omx_free.size()==0);
- input_bufs_omx_mutex.unlock();
- return full;
-
+ //Check, if we have OMX output buffers
+ bool full;
+ input_bufs_omx_mutex.lock();
+ full = (input_bufs_omx_free.size() == 0);
+ input_bufs_omx_mutex.unlock();
+ return full;
}
+u4 AudioOMX::DeliverMediaPacket(MediaPacket mpacket, const u1* buffer, u4* samplepos)
+{
+ /*First Check, if we have an audio sample*/
+ VideoOMX* vw = static_cast<VideoOMX*>(Video::getInstance());
+ bool achange = false;
+ OMX_ERRORTYPE error;
-u4 AudioOMX::DeliverMediaPacket(MediaPacket mpacket, const u1* buffer,
- u4 *samplepos) {
- /*First Check, if we have an audio sample*/
- VideoOMX* vw = static_cast<VideoOMX*>(Video::getInstance());
- bool achange=false;
- OMX_ERRORTYPE error;
- //Log *logger=Log::getInstance();
- if (vw->InIframemode()) {
- samplepos = 0;
- MILLISLEEP(10);
- return 0; //Not in iframe mode!
- }
-
- if (!omx_running) return 0; // if we are not runnig do not do this
- if (vw->isClockPaused()) return 0; //Block if we pause
- //LogNT::getInstance()->debug(TAG, "DMP mark 1");
-
- //LogNT::getInstance()->debug(TAG, "DeliverMediaPacketOMX time {}",mpacket.presentation_time);
-
-/* if (mpacket.synched && mpacket.presentation_time <= 0) {
- *samplepos = mpacket.length;
- firstsynched = false;
- lsync=true;
- LogNT::getInstance()->debug(TAG,
- "DeliverMediaPacketOMX Frameskip");
- return mpacket.length;
- }*/
-
- //LogNT::getInstance()->debug(TAG, "DMP mark 2");
-
- u4 headerstrip = 0;
- if (mpacket.disconti) {
- firstsynched = false;
- decompress_buffer_filled=0;
- if (cur_input_buf_omx) {
- error = vw->ProtOMXEmptyThisBuffer(omx_aud_rend/*dec*/,
- cur_input_buf_omx);
- if (error != OMX_ErrorNone) {
- LogNT::getInstance()->debug(TAG,
- "OMX_EmptyThisBuffer 1 failed {:#x}", error);
- }
- cur_input_buf_omx = NULL;
- }
- lsync=true;
- }
- //LogNT::getInstance()->debug(TAG, "DMP mark 3");
- if (mpacket.type != lastAType) {//Format Change //Push data out !
- firstsynched = false;
- achange=true;
- mp3sameheader=0;
- LogNT::getInstance()->debug(TAG,"Notice audio type change {} {}", mpacket.type,lastAType);
- lastAType = mpacket.type;
- decompress_buffer_filled=0;
-
- if (cur_input_buf_omx) {
- error = vw->ProtOMXEmptyThisBuffer(omx_aud_rend/*dec*/,
- cur_input_buf_omx);
- if (error != OMX_ErrorNone) {
- LogNT::getInstance()->debug(TAG,
- "OMX_EmptyThisBuffer 2 failed {:#x}", error);
- }
- cur_input_buf_omx = NULL;
- }
-
- int oldcancelstate;
- int oldcanceltype;
- pthread_setcancelstate(PTHREAD_CANCEL_DISABLE, &oldcancelstate);
- pthread_setcanceltype(PTHREAD_CANCEL_DEFERRED, &oldcanceltype);
- vw->LockClock();
- if (!ChangeAudioPortConfig(true)) {
- LogNT::getInstance()->debug(TAG,
- "Changing audio port config failed", error);
- }
- vw->UnlockClock();
- pthread_setcancelstate(oldcancelstate, NULL);
- pthread_setcanceltype(oldcanceltype, NULL);
- lsync=true;
-
- }
- //LogNT::getInstance()->debug(TAG, "DMP mark 4");
-
- /*Inspect PES-Header */
- if (*samplepos == 0 && mpacket.type != MPTYPE_MPEG_AUDIO_LAYER3) {//stripheader
- headerstrip = buffer[mpacket.pos_buffer + 8] + 9;
- if (mpacket.type == MPTYPE_AC3)
- headerstrip += 4; //skip ac3 bytes
- *samplepos += headerstrip;
- if (mpacket.synched) {
- if (cur_input_buf_omx) {
- //cur_input_buf_omx->nFlags |= OMX_BUFFERFLAG_ENDOFFRAME;
- error = vw->ProtOMXEmptyThisBuffer(omx_aud_rend/*dec*/,
- cur_input_buf_omx);
- if (error != OMX_ErrorNone) {
- LogNT::getInstance()->debug(TAG,
- "OMX_EmptyThisBuffer 3 failed {:#x}", error);
- }
- //vw->AdjustAudioPTS(correctAudioLatency(lastreftimeOMX,cur_input_buf_omx->nFilledLen/(2*2),48000));
-
- cur_input_buf_omx = NULL;//write out old data
- }
- firstsynched = true;
- //decompress_buffer_filled=0;
- } else {
- if (!firstsynched) {//
- *samplepos = mpacket.length;//if we have not processed at least one
- decompress_buffer_filled=0;
- //LogNT::getInstance()->debug(TAG, "DMP mark 5");
- return mpacket.length;//synched packet ignore it!
- }
- }
- }
- if (!cur_input_buf_omx) {
- input_bufs_omx_mutex.lock();
- if (input_bufs_omx_free.size()==0) {
- input_bufs_omx_mutex.unlock();
- //LogNT::getInstance()->debug(TAG, "DMP mark 6");
- //LogNT::getInstance()->debug(TAG, "Deliver MediaPacket no free sample");
- return 0; // we do not have a free media sample
-
- }
- cur_input_buf_omx=input_bufs_omx_free.front();
- cur_input_buf_omx->nFilledLen=0;
- cur_input_buf_omx->nOffset=0;
- cur_input_buf_omx->nTimeStamp=VideoOMX::intToOMXTicks(0);
- input_bufs_omx_free.pop_front();
- input_bufs_omx_mutex.unlock();
- }
- //LogNT::getInstance()->debug(TAG, "DMP mark 7");
-
- if (cur_input_buf_omx->nFilledLen == 0) {//will only be changed on first packet
- if (mpacket.synched) {
- //LogNT::getInstance()->debug(TAG,
- // "packet synched marker");
-
- //lastreftimePTS=mpacket.pts;
- if (omx_first_frame) { // TODO time
- cur_input_buf_omx->nFlags = OMX_BUFFERFLAG_STARTTIME;
- LogNT::getInstance()->debug(TAG, "Starttime");
- omx_first_frame = false;
- } else {
- cur_input_buf_omx->nFlags = 0;
- //cur_input_buf_omx->nFlags|=OMX_BUFFERFLAG_TIME_UNKNOWN;
- }
- lastreftimeOMX = mpacket.presentation_time;
- //LogNT::getInstance()->debug(TAG,
- // "Time code {} pts {} dts {}", lastreftimeOMX, mpacket.pts,mpacket.dts);
- lastreftimePTS = mpacket.pts;
- cur_input_buf_omx->nTimeStamp = VideoOMX::intToOMXTicks(lastreftimeOMX/10LL); // the clock component is faulty;
- } else {
- // LogNT::getInstance()->debug(TAG,
- // "packet NOT synched marker");
- cur_input_buf_omx->nFlags = OMX_BUFFERFLAG_TIME_UNKNOWN;
- cur_input_buf_omx->nTimeStamp = VideoOMX::intToOMXTicks(0);
-
- }
- if (mpacket.disconti || achange) {
- cur_input_buf_omx->nFlags |= OMX_BUFFERFLAG_DISCONTINUITY;
- //mp23codec_context_libav->frame_size=-1;
- //ac3codec_context_libav->frame_size=-1;
- }
-
- }
- //LogNT::getInstance()->debug(TAG, "DMP mark 8");
-
- if (*samplepos>mpacket.length) *samplepos=0; //propably the thread got interrupted and sample is not valid any more!
- unsigned int haveToCopy=mpacket.length-*samplepos;
-
- if (passthrough) {
- while (haveToCopy>0) {
- //LogNT::getInstance()->debug(TAG, "DMP mark 9");
- if (lsync) {
- unsigned int gotframesize=0;
- int adv=0;
- switch (mpacket.type) {
- case MPTYPE_MPEG_AUDIO:
- case MPTYPE_MPEG_AUDIO_LAYER3: {
- adv = AdvanceMpAudioSync(buffer+mpacket.pos_buffer+*samplepos,
- haveToCopy,&gotframesize);
- }
- break;
- case MPTYPE_AC3:
- case MPTYPE_AC3_PRE13: {
- adv = AdvanceAc3AudioSync(buffer+mpacket.pos_buffer+*samplepos,
- haveToCopy,&gotframesize);
- }
- break;
-
- case MPTYPE_AAC_LATM: {
- adv = AdvanceAacLatmAudioSync(buffer+mpacket.pos_buffer+*samplepos,
- haveToCopy,&gotframesize);
- }
- break;
- };
- if (adv != (int)haveToCopy) {
- lsync=false;
- haveToCopy-=adv;
- *samplepos+=adv;
- } else {
- *samplepos=mpacket.length; //no ac3 sync byte
- //LogNT::getInstance()->debug(TAG, "DMP mark 10");
- return mpacket.length;
- }
- }
- // so everything is fine now do a memcpy
- int cancopy = std::min(haveToCopy, cur_input_buf_omx->nAllocLen-cur_input_buf_omx->nFilledLen);
- memcpy(cur_input_buf_omx->pBuffer + cur_input_buf_omx->nFilledLen, buffer + mpacket.pos_buffer + *samplepos, cancopy);
- haveToCopy-=cancopy;
- cur_input_buf_omx->nFilledLen+=cancopy;
- *samplepos+=cancopy;
- //LogNT::getInstance()->debug(TAG, "DMP mark 11");
-
- error = vw->ProtOMXEmptyThisBuffer(omx_aud_rend/*dec*/, cur_input_buf_omx);
- if (error != OMX_ErrorNone) {
- LogNT::getInstance()->debug(TAG,
- "OMX_EmptyThisBuffer 5 failed {:#x}", error);
- }
- cur_input_buf_omx=NULL;
- if (haveToCopy>0) {
- // get5 new buffer
- input_bufs_omx_mutex.lock();
- if (input_bufs_omx_free.size()==0) {
- input_bufs_omx_mutex.unlock();
- // LogNT::getInstance()->debug(TAG, "Deliver MediaPacket no free sample2");
- return *samplepos; // we do not have a free media sample
- }
- cur_input_buf_omx=input_bufs_omx_free.front();
- cur_input_buf_omx->nFilledLen=0;
- cur_input_buf_omx->nOffset=0;
- cur_input_buf_omx->nFlags=OMX_BUFFERFLAG_TIME_UNKNOWN;
- cur_input_buf_omx->nTimeStamp=VideoOMX::intToOMXTicks(0);
- input_bufs_omx_free.pop_front();
- input_bufs_omx_mutex.unlock();
- }
- //LogNT::getInstance()->debug(TAG, "DMP mark 12");
-
- }
- //LogNT::getInstance()->debug(TAG, "DMP mark 13");
-
- } else {
- int len;
- int gotta;
- int framesize=0;
- int errcount=0;
-
- AVCodecContext *current_context;
- switch (mpacket.type) {
- case MPTYPE_MPEG_AUDIO:
- case MPTYPE_MPEG_AUDIO_LAYER3: {
- current_context = mp23codec_context_libav;
- if (current_context->frame_size<0) framesize=1152; //Maximum framesize
- else framesize=current_context->frame_size;
- }break;
- case MPTYPE_AAC_LATM: {
- current_context = aaclatmcodec_context_libav;
- } break;
- case MPTYPE_AC3:
- case MPTYPE_AC3_PRE13: {
- current_context = ac3codec_context_libav;
- }break;
- };
-
- if (decompress_buffer_filled) { // have a remaining paket
- incoming_paket_libav.data =(uint8_t*) decompress_buffer;
- memcpy(decompress_buffer+decompress_buffer_filled,
- buffer+mpacket.pos_buffer+*samplepos,
- std::min(haveToCopy,decompress_buffer_size-decompress_buffer_filled));
- incoming_paket_libav.size = decompress_buffer_filled
- +std::min(haveToCopy,decompress_buffer_size-decompress_buffer_filled);
- //LogNT::getInstance()->debug(TAG,"Use saved audio buffer {} {} {}",mpacket.type,decompress_buffer_filled,mpacket.synched);
- } else {
- incoming_paket_libav.data =(uint8_t*) buffer+mpacket.pos_buffer+*samplepos;
- incoming_paket_libav.size = haveToCopy;
- }
- //LogNT::getInstance()->debug(TAG, "DMP mark 18");
-
- while (haveToCopy> 0 && errcount<3) {
-
- //LogNT::getInstance()->debug(TAG,"libav in {} {}",framesize,current_context->frame_size);
- //LogNT::getInstance()->debug(TAG, "libav in {} {}",
- // framesize, current_context->frame_size);
-
- bool donotdecompress=false;
- unsigned int gotframesize=0;
- // if (!decompress_buffer_filled) { // only do this if no old data is present
- int adv = 0;
- switch (mpacket.type) {
- case MPTYPE_MPEG_AUDIO:
- case MPTYPE_MPEG_AUDIO_LAYER3: {
- adv = AdvanceMpAudioSync(incoming_paket_libav.data,
- incoming_paket_libav.size,&gotframesize);
- }
- break;
- case MPTYPE_AC3:
- case MPTYPE_AC3_PRE13: {
- adv = AdvanceAc3AudioSync(incoming_paket_libav.data,
- incoming_paket_libav.size,&gotframesize);
- }
- break;
- case MPTYPE_AAC_LATM: {
- adv = AdvanceAacLatmAudioSync(incoming_paket_libav.data,
- incoming_paket_libav.size,&gotframesize);
- }
- break;
- };
- if (adv > 0 /*&& !decompress_buffer_filled*/) {
- incoming_paket_libav.data += adv;
- incoming_paket_libav.size-=adv;
- haveToCopy -= adv;
- *samplepos += adv;
- /*if (current_context->frame_size>0) framesize=min(current_context->frame_size,haveToCopy);
- else*/ framesize=haveToCopy;
- //LogNT::getInstance()->debug(TAG,"Advance by {} {} from {}",adv,mpacket.type,*samplepos );
- if (haveToCopy <= 0) {
- // LogNT::getInstance()->debug(TAG,"No sync code in packet remove {}",mpacket.type);
- *samplepos=mpacket.length;
- return mpacket.length;
- }
-
-
- // } //
-
- if (gotframesize>0 && gotframesize>haveToCopy) {
- donotdecompress=true;
- errcount=100; // exit loop
- }
- // else LogNT::getInstance()->debug(TAG,"Loop run");
- }
- //LogNT::getInstance()->debug(TAG, "DMP mark 19");
- if (!donotdecompress) {
- int oldcancelstate;
- int oldcanceltype;
- pthread_testcancel();
- pthread_setcancelstate(PTHREAD_CANCEL_DISABLE, &oldcancelstate);
- pthread_setcanceltype(PTHREAD_CANCEL_DEFERRED, &oldcanceltype);
- libav_mutex.lock();
- if (!omx_running || !mp23codec_context_libav
- || !ac3codec_context_libav) {
- libav_mutex.unlock();
- return *samplepos;
- }
- libav_mutex.unlock();
- // LogNT::getInstance()->debug(TAG,"libav out");
- int save_size=incoming_paket_libav.size;
-
- if ((int)gotframesize <= incoming_paket_libav.size) {
- if (gotframesize>0) incoming_paket_libav.size=gotframesize;
-
- // FIXME
- // avcodec_decode_audio4 is deprecated
- // DO_NOT_USE() works, but assumes all decoded data is returned
- // in the first call to avcodec_receive_frame which is
- // definitely bad code.
- // This all needs reworking to handle this properly.
- // Leaving DO_NOT_USE in the code in case we have to switch to it
- len = avcodec_decode_audio4(current_context, decode_frame_libav,
- &gotta, &incoming_paket_libav);
-
- //len = DO_NOT_USE(current_context, decode_frame_libav,
- // &gotta, &incoming_paket_libav);
-
- } else {
- //LogNT::getInstance()->debug(TAG, "FRAME:E {} {}",gotframesize,incoming_paket_libav.size);
- gotta=0;
- len=0;
- }
- //LogNT::getInstance()->debug(TAG, "FRAME:T {}",len);
- incoming_paket_libav.size=save_size;
- //LogNT::getInstance()->debug(TAG, "libav out1");
- pthread_setcancelstate(oldcancelstate, NULL);
- pthread_setcanceltype(oldcanceltype, NULL);
- pthread_testcancel();
-
- } else {
- gotta=0;
- len=0;
- }
- //LogNT::getInstance()->debug(TAG, "libav out2");
- //LogNT::getInstance()->debug(TAG, "DMP mark 20");
- if (!omx_running) {
- libav_mutex.unlock();
- return *samplepos;
- }
-
- if (decompress_buffer_filled) { // reset to normal decoding
- if (len>0) {
-
- // FIXME
-
- // len is int
- // decompress_buffer_filled is unsigned int
- // so if decompress_buffer_filled > len, len can go negative.
-
- // Why would you use a min function with one of the values hard coded to zero?
- // If param1 is positive the result is always 0.
- // If param1 is negative the result is always param1.
- // However, badMinimumFunction is and always was: int badMinimumFunction(u4 a, int b)
- // .. which takes param1 as unsigned. So whatever param1 is, the result is always 0.
-
- // A guess is that the intention was to try to calculate a positive result, but if
- // for some reason len-decompress_buffer_filled < 0, return 0.
- // But for that you would use a max() function...
-
- //haveToCopy -= badMinimumFunction(len - decompress_buffer_filled, 0);
- //*samplepos += badMinimumFunction(len - decompress_buffer_filled, 0);
-
- int result = badMinimumFunction(len - decompress_buffer_filled, 0);
- haveToCopy -= result;
- *samplepos += result;
-
- abort(); // When does this run?
-
-
- // len is always either 0 or the result of avcodec_decode_audio4(current_context, decode_frame_libav, &gotta, &incoming_paket_libav);
- // the result of avcodec_decode_audio4 can be negative in case of error, but that is filtered out above
-
- // decompress_buffer_filled appears to be how much of the decompress buffer has already been written to.
- // Presumably things can happen in multiple chunks.
-
-
- //if (current_context->frame_size>0) framesize=min(current_context->frame_size,haveToCopy);
- /*else*/ framesize=haveToCopy;
- }
- else
- {
- framesize=haveToCopy;
- }
- incoming_paket_libav.data =(uint8_t*) buffer+mpacket.pos_buffer+*samplepos;
- errcount=0;
- decompress_buffer_filled=0;
- } else {
-
- if (len>0) {
- incoming_paket_libav.data += len;
- haveToCopy -= len;
- *samplepos += len;
- errcount=0;
- /*if (current_context->frame_size>0) framesize=min(current_context->frame_size,haveToCopy);
- else*/framesize=haveToCopy;
- } else {
- errcount++;
- framesize=haveToCopy;
- }
- }
- //LogNT::getInstance()->debug(TAG, "DMP mark 21");
-
- incoming_paket_libav.size =framesize;
- if (gotta) {
- //LogNT::getInstance()->debug(TAG,
- // "Got a frame");
-
- int dsize = av_samples_get_buffer_size(NULL,
- /*current_context->channels*/2, decode_frame_libav->nb_samples,
- AV_SAMPLE_FMT_S16, 1);
- /* int dsize_in = av_samples_get_buffer_size(NULL,
- current_context->channels, decode_frame_libav->nb_samples,
- current_context->sample_fmt, 1); -- unused */
- //if (current_context->channels==1) dsize*=2; // we convert mono to stereo
- if ((cur_input_buf_omx->nFilledLen + dsize)
- > cur_input_buf_omx->nAllocLen ) {
- // I doubt that this will ever happen
- // LogNT::getInstance()->debug(TAG,
- // "P 2 Time code {} pts {}", lastreftimeOMX, mpacket.pts);
- error = vw->ProtOMXEmptyThisBuffer(omx_aud_rend/*dec*/,
- cur_input_buf_omx);
- if (error != OMX_ErrorNone) {
- LogNT::getInstance()->debug(TAG,
- "OMX_EmptyThisBuffer 4 failed {:#x}", error);
- }
- cur_input_buf_omx = NULL;
-
- if (!cur_input_buf_omx) {
- int count = 0;
- while (count < 10 && omx_running) {
- count++;
- input_bufs_omx_mutex.lock();
- if (input_bufs_omx_free.size() == 0) {
- input_bufs_omx_mutex.unlock();
- // LogNT::getInstance()->debug(TAG,
- // "Deliver MediaPacket no free sample");
- MILLISLEEP(5);
- //LogNT::getInstance()->debug(TAG, "DMP mark22");
- if (!omx_running) return *samplepos;
- //LogNT::getInstance()->debug(TAG, "DMP mark 23");
- continue;
- }
- cur_input_buf_omx = input_bufs_omx_free.front();
- cur_input_buf_omx->nFilledLen = 0;
- cur_input_buf_omx->nOffset = 0;
- cur_input_buf_omx->nTimeStamp = VideoOMX::intToOMXTicks(0);
- cur_input_buf_omx->nFlags=OMX_BUFFERFLAG_TIME_UNKNOWN;
- input_bufs_omx_free.pop_front();
- input_bufs_omx_mutex.unlock();
- break;
- }
- if (!cur_input_buf_omx) return *samplepos;
- }
-
- }
-
- //LogNT::getInstance()->debug(TAG,"memcpy in {} {} {}" ,dsize,current_context->sample_rate,cur_input_buf_omx->nFilledLen);
-
-
- av_opt_set_int(resam_con_libav, "in_sample_rate",decode_frame_libav->sample_rate,0);
- av_opt_set_int(resam_con_libav, "in_sample_fmt",decode_frame_libav->format,0);
- av_opt_set_int(resam_con_libav, "in_channel_layout",decode_frame_libav->channel_layout, 0);
- //LogNT::getInstance()->error(TAG, "AV resampledata {} {} {} {}",current_context->channels,current_context->sample_rate,current_context->sample_fmt,current_context->channel_layout);
- //LogNT::getInstance()->error(TAG, "AV resampledata2 {} {} {}",decode_frame_libav->sample_rate,decode_frame_libav->format,decode_frame_libav->channel_layout);
-
- int ret = swr_init(resam_con_libav);
- if (ret<0) {
- LogNT::getInstance()->error(TAG, "Opening AV resample failed {}",ret);
- } else {
- uint8_t *output=cur_input_buf_omx->pBuffer + cur_input_buf_omx->nFilledLen;
-/*
- * old docs:
- avresample_convert ( AVAudioResampleContext * avr,
- uint8_t ** output,
- int out_plane_size,
- int out_samples,
- uint8_t *const * input,
- int in_plane_size,
- int in_samples
- )
-
- old call:
- avresample_convert(resam_con_libav,
- &output, dsize, decode_frame_libav->nb_samples,
- decode_frame_libav->extended_data, decode_frame_libav->linesize[0], decode_frame_libav->nb_samples);
-
- new docs:
- swr_convert ( struct SwrContext * s,
- uint8_t ** out,
- int out_count,
- const uint8_t ** in,
- int in_count
- )
- new call:
- */
- //LogNT::getInstance()->debug(TAG, "Calling swr_convert");
-
- swr_convert(resam_con_libav, &output, decode_frame_libav->nb_samples, (const uint8_t**)decode_frame_libav->extended_data, decode_frame_libav->nb_samples);
-
- swr_close(resam_con_libav);
- }
-
- //LogNT::getInstance()->debug(TAG,"memcpy out");
- cur_input_buf_omx->nFilledLen += dsize;
- } else {
- //LogNT::getInstance()->debug(TAG,"Incomplete mpeg frames in pes packet {} {}",incoming_paket_libav.size,mpacket.length);
- /* uint8_t a1=incoming_paket_libav.data[0];
- uint8_t a2=incoming_paket_libav.data[1];
- uint8_t a3=incoming_paket_libav.data[2];
- uint8_t a4=incoming_paket_libav.data[3];*/
- // LogNT::getInstance()->debug(TAG,"Header {:#x} {:#x} {:#x} {:#x}",a1,a2,
- // a3,a4);
- }
-
- }
- //LogNT::getInstance()->debug(TAG, "DMP mark 24");
- decompress_buffer_filled=0;
- if (haveToCopy ) {
- //LogNT::getInstance()->debug(TAG,"We can not decompress {} save for later {} {:#x} {:#x}",haveToCopy,mpacket.type,incoming_paket_libav.data,mpacket.pos_buffer);
- memcpy(decompress_buffer,incoming_paket_libav.data, std::min(haveToCopy,decompress_buffer_size));
-
- decompress_buffer_filled=std::min(haveToCopy,decompress_buffer_size);
-
- }
-
- if (cur_input_buf_omx->nFilledLen) {
- //LogNT::getInstance()->debug(TAG,
- // "P 3 Time code {} pts {}", lastreftimeOMX, mpacket.pts);
- error = vw->ProtOMXEmptyThisBuffer(omx_aud_rend/*dec*/, cur_input_buf_omx);
- if (error != OMX_ErrorNone) {
- LogNT::getInstance()->debug(TAG,
- "OMX_EmptyThisBuffer 5 failed {:#x}", error);
- }
- //if (mpacket.synched) vw->AdjustAudioPTS(correctAudioLatency(lastreftimeOMX,cur_input_buf_omx->nFilledLen/(2*2),48000));
- cur_input_buf_omx = NULL;
- }
- }
-
-
- //LogNT::getInstance()->debug(TAG, "DMP mark 25");
-
- *samplepos=mpacket.length;
- return mpacket.length;
+ //Log *logger=Log::getInstance();
+ if (vw->InIframemode())
+ {
+ samplepos = 0;
+ MILLISLEEP(10);
+ return 0; //Not in iframe mode!
+ }
+
+ if (!omx_running) return 0; // if we are not runnig do not do this
+
+ if (vw->isClockPaused()) return 0; //Block if we pause
+
+ //LogNT::getInstance()->debug(TAG, "DMP mark 1");
+
+ //LogNT::getInstance()->debug(TAG, "DeliverMediaPacketOMX time {}",mpacket.presentation_time);
+
+ /* if (mpacket.synched && mpacket.presentation_time <= 0) {
+ *samplepos = mpacket.length;
+ firstsynched = false;
+ lsync=true;
+ LogNT::getInstance()->debug(TAG,
+ "DeliverMediaPacketOMX Frameskip");
+ return mpacket.length;
+ }*/
+
+ //LogNT::getInstance()->debug(TAG, "DMP mark 2");
+
+ u4 headerstrip = 0;
+
+ if (mpacket.disconti)
+ {
+ firstsynched = false;
+ decompress_buffer_filled = 0;
+
+ if (cur_input_buf_omx)
+ {
+ error = vw->ProtOMXEmptyThisBuffer(omx_aud_rend/*dec*/, cur_input_buf_omx);
+
+ if (error != OMX_ErrorNone)
+ {
+ LogNT::getInstance()->debug(TAG, "OMX_EmptyThisBuffer 1 failed {:#x}", error);
+ }
+
+ cur_input_buf_omx = NULL;
+ }
+
+ lsync = true;
+ }
+
+ //LogNT::getInstance()->debug(TAG, "DMP mark 3");
+ if (mpacket.type != lastAType) //Format Change //Push data out !
+ {
+ firstsynched = false;
+ achange = true;
+ mp3sameheader = 0;
+ LogNT::getInstance()->debug(TAG, "Notice audio type change {} {}", mpacket.type, lastAType);
+ lastAType = mpacket.type;
+ decompress_buffer_filled = 0;
+
+ if (cur_input_buf_omx)
+ {
+ error = vw->ProtOMXEmptyThisBuffer(omx_aud_rend/*dec*/,
+ cur_input_buf_omx);
+
+ if (error != OMX_ErrorNone)
+ {
+ LogNT::getInstance()->debug(TAG, "OMX_EmptyThisBuffer 2 failed {:#x}", error);
+ }
+
+ cur_input_buf_omx = NULL;
+ }
+
+ int oldcancelstate;
+ int oldcanceltype;
+ pthread_setcancelstate(PTHREAD_CANCEL_DISABLE, &oldcancelstate);
+ pthread_setcanceltype(PTHREAD_CANCEL_DEFERRED, &oldcanceltype);
+ vw->LockClock();
+
+ if (!ChangeAudioPortConfig(true))
+ {
+ LogNT::getInstance()->debug(TAG, "Changing audio port config failed", error);
+ }
+
+ vw->UnlockClock();
+ pthread_setcancelstate(oldcancelstate, NULL);
+ pthread_setcanceltype(oldcanceltype, NULL);
+ lsync = true;
+ }
+
+ //LogNT::getInstance()->debug(TAG, "DMP mark 4");
+
+ /*Inspect PES-Header */
+ if (*samplepos == 0 && mpacket.type != MPTYPE_MPEG_AUDIO_LAYER3) //stripheader
+ {
+ headerstrip = buffer[mpacket.pos_buffer + 8] + 9;
+
+ if (mpacket.type == MPTYPE_AC3)
+ headerstrip += 4; //skip ac3 bytes
+
+ *samplepos += headerstrip;
+
+ if (mpacket.synched)
+ {
+ if (cur_input_buf_omx)
+ {
+ //cur_input_buf_omx->nFlags |= OMX_BUFFERFLAG_ENDOFFRAME;
+ error = vw->ProtOMXEmptyThisBuffer(omx_aud_rend/*dec*/, cur_input_buf_omx);
+
+ if (error != OMX_ErrorNone)
+ {
+ LogNT::getInstance()->debug(TAG, "OMX_EmptyThisBuffer 3 failed {:#x}", error);
+ }
+
+ //vw->AdjustAudioPTS(correctAudioLatency(lastreftimeOMX,cur_input_buf_omx->nFilledLen/(2*2),48000));
+
+ cur_input_buf_omx = NULL;//write out old data
+ }
+
+ firstsynched = true;
+ //decompress_buffer_filled=0;
+ }
+ else
+ {
+ if (!firstsynched) //
+ {
+ *samplepos = mpacket.length;//if we have not processed at least one
+ decompress_buffer_filled = 0;
+ //LogNT::getInstance()->debug(TAG, "DMP mark 5");
+ return mpacket.length;//synched packet ignore it!
+ }
+ }
+ }
+
+ if (!cur_input_buf_omx)
+ {
+ input_bufs_omx_mutex.lock();
+
+ if (input_bufs_omx_free.size() == 0)
+ {
+ input_bufs_omx_mutex.unlock();
+ //LogNT::getInstance()->debug(TAG, "DMP mark 6");
+ //LogNT::getInstance()->debug(TAG, "Deliver MediaPacket no free sample");
+ return 0; // we do not have a free media sample
+ }
+
+ cur_input_buf_omx = input_bufs_omx_free.front();
+ cur_input_buf_omx->nFilledLen = 0;
+ cur_input_buf_omx->nOffset = 0;
+ cur_input_buf_omx->nTimeStamp = VideoOMX::intToOMXTicks(0);
+ input_bufs_omx_free.pop_front();
+ input_bufs_omx_mutex.unlock();
+ }
+
+ //LogNT::getInstance()->debug(TAG, "DMP mark 7");
+
+ if (cur_input_buf_omx->nFilledLen == 0) //will only be changed on first packet
+ {
+ if (mpacket.synched)
+ {
+ //LogNT::getInstance()->debug(TAG,
+ // "packet synched marker");
+
+ //lastreftimePTS=mpacket.pts;
+ if (omx_first_frame) // TODO time
+ {
+ cur_input_buf_omx->nFlags = OMX_BUFFERFLAG_STARTTIME;
+ LogNT::getInstance()->debug(TAG, "Starttime");
+ omx_first_frame = false;
+ }
+ else
+ {
+ cur_input_buf_omx->nFlags = 0;
+ //cur_input_buf_omx->nFlags|=OMX_BUFFERFLAG_TIME_UNKNOWN;
+ }
+
+ lastreftimeOMX = mpacket.presentation_time;
+ //LogNT::getInstance()->debug(TAG,
+ // "Time code {} pts {} dts {}", lastreftimeOMX, mpacket.pts,mpacket.dts);
+ lastreftimePTS = mpacket.pts;
+ cur_input_buf_omx->nTimeStamp = VideoOMX::intToOMXTicks(lastreftimeOMX / 10LL); // the clock component is faulty;
+ }
+ else
+ {
+ // LogNT::getInstance()->debug(TAG,
+ // "packet NOT synched marker");
+ cur_input_buf_omx->nFlags = OMX_BUFFERFLAG_TIME_UNKNOWN;
+ cur_input_buf_omx->nTimeStamp = VideoOMX::intToOMXTicks(0);
+ }
+
+ if (mpacket.disconti || achange)
+ {
+ cur_input_buf_omx->nFlags |= OMX_BUFFERFLAG_DISCONTINUITY;
+ //mp23codec_context_libav->frame_size=-1;
+ //ac3codec_context_libav->frame_size=-1;
+ }
+ }
+
+ //LogNT::getInstance()->debug(TAG, "DMP mark 8");
+ if (*samplepos > mpacket.length) *samplepos = 0; //propably the thread got interrupted and sample is not valid any more!
+
+ unsigned int haveToCopy = mpacket.length - *samplepos;
+
+ if (passthrough)
+ {
+ while (haveToCopy > 0)
+ {
+ //LogNT::getInstance()->debug(TAG, "DMP mark 9");
+ if (lsync)
+ {
+ unsigned int gotframesize = 0;
+ int adv = 0;
+
+ switch (mpacket.type)
+ {
+ case MPTYPE_MPEG_AUDIO:
+ case MPTYPE_MPEG_AUDIO_LAYER3:
+ {
+ adv = AdvanceMpAudioSync(buffer + mpacket.pos_buffer + *samplepos, haveToCopy, &gotframesize);
+ }
+ break;
+
+ case MPTYPE_AC3:
+ case MPTYPE_AC3_PRE13:
+ {
+ adv = AdvanceAc3AudioSync(buffer + mpacket.pos_buffer + *samplepos, haveToCopy, &gotframesize);
+ }
+ break;
+
+ case MPTYPE_AAC_LATM:
+ {
+ adv = AdvanceAacLatmAudioSync(buffer + mpacket.pos_buffer + *samplepos, haveToCopy, &gotframesize);
+ }
+ break;
+ }
+
+ if (adv != (int)haveToCopy)
+ {
+ lsync = false;
+ haveToCopy -= adv;
+ *samplepos += adv;
+ }
+ else
+ {
+ *samplepos = mpacket.length; //no ac3 sync byte
+ //LogNT::getInstance()->debug(TAG, "DMP mark 10");
+ return mpacket.length;
+ }
+ }
+
+ // so everything is fine now do a memcpy
+ int cancopy = std::min(haveToCopy, cur_input_buf_omx->nAllocLen - cur_input_buf_omx->nFilledLen);
+ memcpy(cur_input_buf_omx->pBuffer + cur_input_buf_omx->nFilledLen, buffer + mpacket.pos_buffer + *samplepos, cancopy);
+ haveToCopy -= cancopy;
+ cur_input_buf_omx->nFilledLen += cancopy;
+ *samplepos += cancopy;
+ //LogNT::getInstance()->debug(TAG, "DMP mark 11");
+
+ error = vw->ProtOMXEmptyThisBuffer(omx_aud_rend/*dec*/, cur_input_buf_omx);
+
+ if (error != OMX_ErrorNone)
+ {
+ LogNT::getInstance()->debug(TAG, "OMX_EmptyThisBuffer 5 failed {:#x}", error);
+ }
+
+ cur_input_buf_omx = NULL;
+
+ if (haveToCopy > 0)
+ {
+ // get5 new buffer
+ input_bufs_omx_mutex.lock();
+
+ if (input_bufs_omx_free.size() == 0)
+ {
+ input_bufs_omx_mutex.unlock();
+ // LogNT::getInstance()->debug(TAG, "Deliver MediaPacket no free sample2");
+ return *samplepos; // we do not have a free media sample
+ }
+
+ cur_input_buf_omx = input_bufs_omx_free.front();
+ cur_input_buf_omx->nFilledLen = 0;
+ cur_input_buf_omx->nOffset = 0;
+ cur_input_buf_omx->nFlags = OMX_BUFFERFLAG_TIME_UNKNOWN;
+ cur_input_buf_omx->nTimeStamp = VideoOMX::intToOMXTicks(0);
+ input_bufs_omx_free.pop_front();
+ input_bufs_omx_mutex.unlock();
+ }
+
+ //LogNT::getInstance()->debug(TAG, "DMP mark 12");
+
+ }
+
+ //LogNT::getInstance()->debug(TAG, "DMP mark 13");
+
+ }
+ else
+ {
+ int len;
+ int gotta;
+ int framesize = 0;
+ int errcount = 0;
+
+ AVCodecContext* current_context;
+
+ switch (mpacket.type)
+ {
+ case MPTYPE_MPEG_AUDIO:
+ case MPTYPE_MPEG_AUDIO_LAYER3:
+ {
+ current_context = mp23codec_context_libav;
+
+ if (current_context->frame_size < 0) framesize = 1152; //Maximum framesize
+ else framesize = current_context->frame_size;
+ } break;
+
+ case MPTYPE_AAC_LATM:
+ {
+ current_context = aaclatmcodec_context_libav;
+ } break;
+
+ case MPTYPE_AC3:
+ case MPTYPE_AC3_PRE13:
+ {
+ current_context = ac3codec_context_libav;
+ } break;
+ }
+
+ if (decompress_buffer_filled) // have a remaining paket
+ {
+ incoming_paket_libav.data = (uint8_t*) decompress_buffer;
+ memcpy(decompress_buffer + decompress_buffer_filled,
+ buffer + mpacket.pos_buffer + *samplepos,
+ std::min(haveToCopy, decompress_buffer_size - decompress_buffer_filled));
+ incoming_paket_libav.size = decompress_buffer_filled
+ + std::min(haveToCopy, decompress_buffer_size - decompress_buffer_filled);
+ //LogNT::getInstance()->debug(TAG,"Use saved audio buffer {} {} {}",mpacket.type,decompress_buffer_filled,mpacket.synched);
+ }
+ else
+ {
+ incoming_paket_libav.data = (uint8_t*) buffer + mpacket.pos_buffer + *samplepos;
+ incoming_paket_libav.size = haveToCopy;
+ }
+
+ //LogNT::getInstance()->debug(TAG, "DMP mark 18");
+
+ while (haveToCopy > 0 && errcount < 3)
+ {
+ //LogNT::getInstance()->debug(TAG,"libav in {} {}",framesize,current_context->frame_size);
+ //LogNT::getInstance()->debug(TAG, "libav in {} {}",
+ // framesize, current_context->frame_size);
+
+ bool donotdecompress = false;
+ unsigned int gotframesize = 0;
+ // if (!decompress_buffer_filled) { // only do this if no old data is present
+ int adv = 0;
+
+ switch (mpacket.type)
+ {
+ case MPTYPE_MPEG_AUDIO:
+ case MPTYPE_MPEG_AUDIO_LAYER3:
+ {
+ adv = AdvanceMpAudioSync(incoming_paket_libav.data,
+ incoming_paket_libav.size, &gotframesize);
+ }
+ break;
+
+ case MPTYPE_AC3:
+ case MPTYPE_AC3_PRE13:
+ {
+ adv = AdvanceAc3AudioSync(incoming_paket_libav.data,
+ incoming_paket_libav.size, &gotframesize);
+ }
+ break;
+
+ case MPTYPE_AAC_LATM:
+ {
+ adv = AdvanceAacLatmAudioSync(incoming_paket_libav.data,
+ incoming_paket_libav.size, &gotframesize);
+ }
+ break;
+ }
+
+ if (adv > 0 /*&& !decompress_buffer_filled*/)
+ {
+ incoming_paket_libav.data += adv;
+ incoming_paket_libav.size -= adv;
+ haveToCopy -= adv;
+ *samplepos += adv;
+ /*if (current_context->frame_size>0) framesize=min(current_context->frame_size,haveToCopy);
+ else*/ framesize = haveToCopy;
+
+ //LogNT::getInstance()->debug(TAG,"Advance by {} {} from {}",adv,mpacket.type,*samplepos );
+ if (haveToCopy <= 0)
+ {
+ // LogNT::getInstance()->debug(TAG,"No sync code in packet remove {}",mpacket.type);
+ *samplepos = mpacket.length;
+ return mpacket.length;
+ }
+
+ // } //
+
+ if (gotframesize > 0 && gotframesize > haveToCopy)
+ {
+ donotdecompress = true;
+ errcount = 100; // exit loop
+ }
+
+ // else LogNT::getInstance()->debug(TAG,"Loop run");
+ }
+
+ //LogNT::getInstance()->debug(TAG, "DMP mark 19");
+ if (!donotdecompress)
+ {
+ int oldcancelstate;
+ int oldcanceltype;
+ pthread_testcancel();
+ pthread_setcancelstate(PTHREAD_CANCEL_DISABLE, &oldcancelstate);
+ pthread_setcanceltype(PTHREAD_CANCEL_DEFERRED, &oldcanceltype);
+ libav_mutex.lock();
+
+ if (!omx_running || !mp23codec_context_libav
+ || !ac3codec_context_libav)
+ {
+ libav_mutex.unlock();
+ return *samplepos;
+ }
+
+ libav_mutex.unlock();
+ // LogNT::getInstance()->debug(TAG,"libav out");
+ int save_size = incoming_paket_libav.size;
+
+ if ((int)gotframesize <= incoming_paket_libav.size)
+ {
+ if (gotframesize > 0) incoming_paket_libav.size = gotframesize;
+
+ // FIXME
+ // avcodec_decode_audio4 is deprecated
+ // DO_NOT_USE() works, but assumes all decoded data is returned
+ // in the first call to avcodec_receive_frame which is
+ // definitely bad code.
+ // This all needs reworking to handle this properly.
+ // Leaving DO_NOT_USE in the code in case we have to switch to it
+ len = avcodec_decode_audio4(current_context, decode_frame_libav,
+ &gotta, &incoming_paket_libav);
+
+ //len = DO_NOT_USE(current_context, decode_frame_libav,
+ // &gotta, &incoming_paket_libav);
+
+ }
+ else
+ {
+ //LogNT::getInstance()->debug(TAG, "FRAME:E {} {}",gotframesize,incoming_paket_libav.size);
+ gotta = 0;
+ len = 0;
+ }
+
+ //LogNT::getInstance()->debug(TAG, "FRAME:T {}",len);
+ incoming_paket_libav.size = save_size;
+ //LogNT::getInstance()->debug(TAG, "libav out1");
+ pthread_setcancelstate(oldcancelstate, NULL);
+ pthread_setcanceltype(oldcanceltype, NULL);
+ pthread_testcancel();
+
+ }
+ else
+ {
+ gotta = 0;
+ len = 0;
+ }
+
+ //LogNT::getInstance()->debug(TAG, "libav out2");
+ //LogNT::getInstance()->debug(TAG, "DMP mark 20");
+ if (!omx_running)
+ {
+ libav_mutex.unlock();
+ return *samplepos;
+ }
+
+ if (decompress_buffer_filled) // reset to normal decoding
+ {
+ if (len > 0)
+ {
+ // FIXME
+
+ // len is int
+ // decompress_buffer_filled is unsigned int
+ // so if decompress_buffer_filled > len, len can go negative.
+
+ // Why would you use a min function with one of the values hard coded to zero?
+ // If param1 is positive the result is always 0.
+ // If param1 is negative the result is always param1.
+ // However, badMinimumFunction is and always was: int badMinimumFunction(u4 a, int b)
+ // .. which takes param1 as unsigned. So whatever param1 is, the result is always 0.
+
+ // A guess is that the intention was to try to calculate a positive result, but if
+ // for some reason len-decompress_buffer_filled < 0, return 0.
+ // But for that you would use a max() function...
+
+ //haveToCopy -= badMinimumFunction(len - decompress_buffer_filled, 0);
+ //*samplepos += badMinimumFunction(len - decompress_buffer_filled, 0);
+
+ int result = badMinimumFunction(len - decompress_buffer_filled, 0);
+ haveToCopy -= result;
+ *samplepos += result;
+
+ abort(); // When does this run?
+
+
+ // len is always either 0 or the result of avcodec_decode_audio4(current_context, decode_frame_libav, &gotta, &incoming_paket_libav);
+ // the result of avcodec_decode_audio4 can be negative in case of error, but that is filtered out above
+
+ // decompress_buffer_filled appears to be how much of the decompress buffer has already been written to.
+ // Presumably things can happen in multiple chunks.
+
+
+ //if (current_context->frame_size>0) framesize=min(current_context->frame_size,haveToCopy);
+ /*else*/ framesize = haveToCopy;
+ }
+ else
+ {
+ framesize = haveToCopy;
+ }
+
+ incoming_paket_libav.data = (uint8_t*) buffer + mpacket.pos_buffer + *samplepos;
+ errcount = 0;
+ decompress_buffer_filled = 0;
+ }
+ else
+ {
+ if (len > 0)
+ {
+ incoming_paket_libav.data += len;
+ haveToCopy -= len;
+ *samplepos += len;
+ errcount = 0;
+ /*if (current_context->frame_size>0) framesize=min(current_context->frame_size,haveToCopy);
+ else*/framesize = haveToCopy;
+ }
+ else
+ {
+ errcount++;
+ framesize = haveToCopy;
+ }
+ }
+
+ //LogNT::getInstance()->debug(TAG, "DMP mark 21");
+
+ incoming_paket_libav.size = framesize;
+
+ if (gotta)
+ {
+ //LogNT::getInstance()->debug(TAG,
+ // "Got a frame");
+
+ int dsize = av_samples_get_buffer_size(NULL,
+ /*current_context->channels*/2, decode_frame_libav->nb_samples,
+ AV_SAMPLE_FMT_S16, 1);
+
+ /* int dsize_in = av_samples_get_buffer_size(NULL,
+ current_context->channels, decode_frame_libav->nb_samples,
+ current_context->sample_fmt, 1); -- unused */
+ //if (current_context->channels==1) dsize*=2; // we convert mono to stereo
+ if ((cur_input_buf_omx->nFilledLen + dsize) > cur_input_buf_omx->nAllocLen)
+ {
+ // I doubt that this will ever happen
+ // LogNT::getInstance()->debug(TAG,
+ // "P 2 Time code {} pts {}", lastreftimeOMX, mpacket.pts);
+ error = vw->ProtOMXEmptyThisBuffer(omx_aud_rend/*dec*/, cur_input_buf_omx);
+ if (error != OMX_ErrorNone)
+ {
+ LogNT::getInstance()->debug(TAG, "OMX_EmptyThisBuffer 4 failed {:#x}", error);
+ }
+
+ cur_input_buf_omx = NULL;
+
+ if (!cur_input_buf_omx)
+ {
+ int count = 0;
+
+ while (count < 10 && omx_running)
+ {
+ count++;
+ input_bufs_omx_mutex.lock();
+
+ if (input_bufs_omx_free.size() == 0)
+ {
+ input_bufs_omx_mutex.unlock();
+ // LogNT::getInstance()->debug(TAG,
+ // "Deliver MediaPacket no free sample");
+ MILLISLEEP(5);
+
+ //LogNT::getInstance()->debug(TAG, "DMP mark22");
+ if (!omx_running) return *samplepos;
+
+ //LogNT::getInstance()->debug(TAG, "DMP mark 23");
+ continue;
+ }
+
+ cur_input_buf_omx = input_bufs_omx_free.front();
+ cur_input_buf_omx->nFilledLen = 0;
+ cur_input_buf_omx->nOffset = 0;
+ cur_input_buf_omx->nTimeStamp = VideoOMX::intToOMXTicks(0);
+ cur_input_buf_omx->nFlags = OMX_BUFFERFLAG_TIME_UNKNOWN;
+ input_bufs_omx_free.pop_front();
+ input_bufs_omx_mutex.unlock();
+ break;
+ }
+
+ if (!cur_input_buf_omx) return *samplepos;
+ }
+ }
+
+ //LogNT::getInstance()->debug(TAG,"memcpy in {} {} {}" ,dsize,current_context->sample_rate,cur_input_buf_omx->nFilledLen);
+
+
+ av_opt_set_int(resam_con_libav, "in_sample_rate", decode_frame_libav->sample_rate, 0);
+ av_opt_set_int(resam_con_libav, "in_sample_fmt", decode_frame_libav->format, 0);
+ av_opt_set_int(resam_con_libav, "in_channel_layout", decode_frame_libav->channel_layout, 0);
+ //LogNT::getInstance()->error(TAG, "AV resampledata {} {} {} {}",current_context->channels,current_context->sample_rate,current_context->sample_fmt,current_context->channel_layout);
+ //LogNT::getInstance()->error(TAG, "AV resampledata2 {} {} {}",decode_frame_libav->sample_rate,decode_frame_libav->format,decode_frame_libav->channel_layout);
+
+ int ret = swr_init(resam_con_libav);
+
+ if (ret < 0)
+ {
+ LogNT::getInstance()->error(TAG, "Opening AV resample failed {}", ret);
+ }
+ else
+ {
+ uint8_t* output = cur_input_buf_omx->pBuffer + cur_input_buf_omx->nFilledLen;
+ /*
+ * old docs:
+ avresample_convert ( AVAudioResampleContext * avr,
+ uint8_t ** output,
+ int out_plane_size,
+ int out_samples,
+ uint8_t *const * input,
+ int in_plane_size,
+ int in_samples
+ )
+
+ old call:
+ avresample_convert(resam_con_libav,
+ &output, dsize, decode_frame_libav->nb_samples,
+ decode_frame_libav->extended_data, decode_frame_libav->linesize[0], decode_frame_libav->nb_samples);
+
+ new docs:
+ swr_convert ( struct SwrContext * s,
+ uint8_t ** out,
+ int out_count,
+ const uint8_t ** in,
+ int in_count
+ )
+ new call:
+ */
+ //LogNT::getInstance()->debug(TAG, "Calling swr_convert");
+
+ swr_convert(resam_con_libav, &output, decode_frame_libav->nb_samples, (const uint8_t**)decode_frame_libav->extended_data, decode_frame_libav->nb_samples);
+
+ swr_close(resam_con_libav);
+ }
+
+ //LogNT::getInstance()->debug(TAG,"memcpy out");
+ cur_input_buf_omx->nFilledLen += dsize;
+ }
+ else
+ {
+ //LogNT::getInstance()->debug(TAG,"Incomplete mpeg frames in pes packet {} {}",incoming_paket_libav.size,mpacket.length);
+ /* uint8_t a1=incoming_paket_libav.data[0];
+ uint8_t a2=incoming_paket_libav.data[1];
+ uint8_t a3=incoming_paket_libav.data[2];
+ uint8_t a4=incoming_paket_libav.data[3];*/
+ // LogNT::getInstance()->debug(TAG,"Header {:#x} {:#x} {:#x} {:#x}",a1,a2,
+ // a3,a4);
+ }
+
+ }
+
+ //LogNT::getInstance()->debug(TAG, "DMP mark 24");
+ decompress_buffer_filled = 0;
+
+ if (haveToCopy)
+ {
+ //LogNT::getInstance()->debug(TAG,"We can not decompress {} save for later {} {:#x} {:#x}",haveToCopy,mpacket.type,incoming_paket_libav.data,mpacket.pos_buffer);
+ memcpy(decompress_buffer, incoming_paket_libav.data, std::min(haveToCopy, decompress_buffer_size));
+ decompress_buffer_filled = std::min(haveToCopy, decompress_buffer_size);
+ }
+
+ if (cur_input_buf_omx->nFilledLen)
+ {
+ //LogNT::getInstance()->debug(TAG,
+ // "P 3 Time code {} pts {}", lastreftimeOMX, mpacket.pts);
+ error = vw->ProtOMXEmptyThisBuffer(omx_aud_rend/*dec*/, cur_input_buf_omx);
+
+ if (error != OMX_ErrorNone)
+ {
+ LogNT::getInstance()->debug(TAG, "OMX_EmptyThisBuffer 5 failed {:#x}", error);
+ }
+
+ //if (mpacket.synched) vw->AdjustAudioPTS(correctAudioLatency(lastreftimeOMX,cur_input_buf_omx->nFilledLen/(2*2),48000));
+ cur_input_buf_omx = NULL;
+ }
+ }
+
+ //LogNT::getInstance()->debug(TAG, "DMP mark 25");
+
+ *samplepos = mpacket.length;
+ return mpacket.length;
}
-long long AudioOMX::SetStartOffset(long long curreftime, bool *rsync)
+long long AudioOMX::SetStartOffset(long long curreftime, bool* rsync)
{
VideoOMX* vw = dynamic_cast<VideoOMX*>(Video::getInstance());
- return vw->SetStartAudioOffset(curreftime,rsync);
+ return vw->SetStartAudioOffset(curreftime, rsync);
}
void AudioOMX::ResetTimeOffsets()
}
int AudioOMX::DO_NOT_USE(AVCodecContext* avctx, // used - sent to avcodec_send_packet
- AVFrame* frame, // used - object for receive to write to
- int* got_frame_ptr, // out param
- const AVPacket* avpkt) // used - sent to avcodec_send_packet
+ AVFrame* frame, // used - object for receive to write to
+ int* got_frame_ptr, // out param
+ const AVPacket* avpkt) // used - sent to avcodec_send_packet
{
// Set this to error here. Any error point returns -9999 and *got_frame_ptr = 0
*got_frame_ptr = 0; // Replicate old API behaviour
int sendReturn = avcodec_send_packet(avctx, avpkt);
+
if (sendReturn < 0) return -9999; // error, shouldn't happen, just crash out.
// Don't use this code
// avcodec_receive_frame needs to be called multiple times
// to ensure reception of all decoded data
int recReturn = avcodec_receive_frame(avctx, frame);
+
if (recReturn == 0) // success
{
- // set got_frame_ptr to 1, this is the old behaviour
+ // set got_frame_ptr to 1, this is the old behaviour
*got_frame_ptr = 1;
- // return number of bytes consumed
- // guessing here that the calling code only ever supplies whole packets
- return avpkt->size;
+ // return number of bytes consumed
+ // guessing here that the calling code only ever supplies whole packets
+ return avpkt->size;
}
// error