bool OMXPlayerAudio::Close() { m_bAbort = true; m_flush = true; Flush(); if(ThreadHandle()) { Lock(); pthread_cond_broadcast(&m_packet_cond); UnLock(); StopThread(); } CloseDecoder(); CloseAudioCodec(); m_open = false; m_stream_id = -1; m_iCurrentPts = DVD_NOPTS_VALUE; m_pStream = NULL; m_speed = DVD_PLAYSPEED_NORMAL; m_dllAvUtil.Unload(); m_dllAvCodec.Unload(); m_dllAvFormat.Unload(); return true; }
bool OMXPlayerAudio::Decode(OMXPacket *pkt) { if(!pkt) return false; /* last decoder reinit went wrong */ if(!m_decoder || !m_pAudioCodec) return true; if(!m_omx_reader->IsActive(OMXSTREAM_AUDIO, pkt->stream_index)) return true; int channels = pkt->hints.channels; /* 6 channel have to be mapped to 8 for PCM */ if(!m_passthrough && !m_hw_decode) { if(channels == 6) channels = 8; } unsigned int old_bitrate = m_hints.bitrate; unsigned int new_bitrate = pkt->hints.bitrate; /* only check bitrate changes on CODEC_ID_DTS, CODEC_ID_AC3, CODEC_ID_EAC3 */ if(m_hints.codec != CODEC_ID_DTS && m_hints.codec != CODEC_ID_AC3 && m_hints.codec != CODEC_ID_EAC3) { new_bitrate = old_bitrate = 0; } /* audio codec changed. reinit device and decoder */ if(m_hints.codec != pkt->hints.codec || m_hints.channels != channels || m_hints.samplerate != pkt->hints.samplerate || old_bitrate != new_bitrate || m_hints.bitspersample != pkt->hints.bitspersample) { ofLog(OF_LOG_VERBOSE, "C : %d %d %d %d %d\n", m_hints.codec, m_hints.channels, m_hints.samplerate, m_hints.bitrate, m_hints.bitspersample); ofLog(OF_LOG_VERBOSE, "N : %d %d %d %d %d\n", pkt->hints.codec, channels, pkt->hints.samplerate, pkt->hints.bitrate, pkt->hints.bitspersample); CloseDecoder(); CloseAudioCodec(); m_hints = pkt->hints; m_player_error = OpenAudioCodec(); if(!m_player_error) return false; m_player_error = OpenDecoder(); if(!m_player_error) return false; m_av_clock->OMXStateExecute(); m_av_clock->OMXReset(); m_av_clock->OMXResume(); } if(!((int)m_decoder->GetSpace() > pkt->size)) OMXClock::OMXSleep(10); if((int)m_decoder->GetSpace() > pkt->size) { if(pkt->pts != DVD_NOPTS_VALUE) m_iCurrentPts = pkt->pts; else if(pkt->dts != DVD_NOPTS_VALUE) m_iCurrentPts = pkt->dts; const uint8_t *data_dec = pkt->data; int data_len = pkt->size; if(!m_passthrough && !m_hw_decode) { while(data_len > 0) { int len = m_pAudioCodec->Decode((BYTE *)data_dec, data_len); if( (len < 0) || (len > data_len) ) { m_pAudioCodec->Reset(); break; } data_dec+= len; data_len -= len; uint8_t *decoded; int decoded_size = m_pAudioCodec->GetData(&decoded); if(decoded_size <=0) continue; int ret = 0; ret = m_decoder->AddPackets(decoded, decoded_size, pkt->dts, pkt->pts); if(ret != decoded_size) { ofLog(OF_LOG_VERBOSE, "error ret %d decoded_size %d\n", ret, decoded_size); } } } else { m_decoder->AddPackets(pkt->data, pkt->size, pkt->dts, pkt->pts); } return true; } else { return false; } }
bool OMXPlayerAudio::Decode(OMXPacket *pkt) { if(!pkt) return false; /* last decoder reinit went wrong */ if(!m_decoder || !m_pAudioCodec) return true; if(!m_omx_reader->IsActive(OMXSTREAM_AUDIO, pkt->stream_index)) return true; int channels = pkt->hints.channels; unsigned int old_bitrate = m_hints.bitrate; unsigned int new_bitrate = pkt->hints.bitrate; /* only check bitrate changes on CODEC_ID_DTS, CODEC_ID_AC3, CODEC_ID_EAC3 */ if(m_hints.codec != CODEC_ID_DTS && m_hints.codec != CODEC_ID_AC3 && m_hints.codec != CODEC_ID_EAC3) { new_bitrate = old_bitrate = 0; } /* audio codec changed. reinit device and decoder */ if(m_hints.codec != pkt->hints.codec || m_hints.channels != channels || m_hints.samplerate != pkt->hints.samplerate || old_bitrate != new_bitrate || m_hints.bitspersample != pkt->hints.bitspersample) { printf("C : %d %d %d %d %d\n", m_hints.codec, m_hints.channels, m_hints.samplerate, m_hints.bitrate, m_hints.bitspersample); printf("N : %d %d %d %d %d\n", pkt->hints.codec, channels, pkt->hints.samplerate, pkt->hints.bitrate, pkt->hints.bitspersample); m_av_clock->OMXPause(); CloseDecoder(); CloseAudioCodec(); m_hints = pkt->hints; m_player_error = OpenAudioCodec(); if(!m_player_error) return false; m_player_error = OpenDecoder(); if(!m_player_error) return false; m_av_clock->OMXStateExecute(); m_av_clock->OMXReset(); m_av_clock->OMXResume(); } if(!((int)m_decoder->GetSpace() > pkt->size)) OMXClock::OMXSleep(10); if((int)m_decoder->GetSpace() > pkt->size) { if(pkt->dts != DVD_NOPTS_VALUE) m_iCurrentPts = pkt->dts; m_av_clock->SetPTS(m_iCurrentPts); const uint8_t *data_dec = pkt->data; int data_len = pkt->size; if(!m_passthrough && !m_hw_decode) { while(data_len > 0) { int len = m_pAudioCodec->Decode((BYTE *)data_dec, data_len); if( (len < 0) || (len > data_len) ) { m_pAudioCodec->Reset(); break; } data_dec+= len; data_len -= len; uint8_t *decoded; int decoded_size = m_pAudioCodec->GetData(&decoded); if(decoded_size <=0) continue; int ret = 0; if(m_bMpeg) ret = m_decoder->AddPackets(decoded, decoded_size, DVD_NOPTS_VALUE, DVD_NOPTS_VALUE); else ret = m_decoder->AddPackets(decoded, decoded_size, m_iCurrentPts, m_iCurrentPts); if(ret != decoded_size) { printf("error ret %d decoded_size %d\n", ret, decoded_size); } int n = (m_hints.channels * 32 * m_hints.samplerate)>>3; if (n > 0 && m_iCurrentPts != DVD_NOPTS_VALUE) m_iCurrentPts += ((double)decoded_size * DVD_TIME_BASE) / n; HandleSyncError((((double)decoded_size * DVD_TIME_BASE) / n), m_iCurrentPts); } } else { if(m_bMpeg) m_decoder->AddPackets(pkt->data, pkt->size, DVD_NOPTS_VALUE, DVD_NOPTS_VALUE); else m_decoder->AddPackets(pkt->data, pkt->size, m_iCurrentPts, m_iCurrentPts); HandleSyncError(0, m_iCurrentPts); } m_av_clock->SetAudioClock(m_iCurrentPts); return true; }
bool OMXPlayerAudio::Decode(OMXPacket *pkt) { if(!pkt) return false; /* last decoder reinit went wrong */ if(!m_decoder || !m_pAudioCodec) return true; if(!m_omx_reader->IsActive(OMXSTREAM_AUDIO, pkt->stream_index)) return true; int channels = pkt->hints.channels; unsigned int old_bitrate = m_hints.bitrate; unsigned int new_bitrate = pkt->hints.bitrate; /* only check bitrate changes on CODEC_ID_DTS, CODEC_ID_AC3, CODEC_ID_EAC3 */ if(m_hints.codec != CODEC_ID_DTS && m_hints.codec != CODEC_ID_AC3 && m_hints.codec != CODEC_ID_EAC3) { new_bitrate = old_bitrate = 0; } // for passthrough we only care about the codec and the samplerate bool minor_change = channels != m_hints.channels || pkt->hints.bitspersample != m_hints.bitspersample || old_bitrate != new_bitrate; if(pkt->hints.codec != m_hints.codec || pkt->hints.samplerate != m_hints.samplerate || (!m_passthrough && minor_change)) { printf("C : %d %d %d %d %d\n", m_hints.codec, m_hints.channels, m_hints.samplerate, m_hints.bitrate, m_hints.bitspersample); printf("N : %d %d %d %d %d\n", pkt->hints.codec, channels, pkt->hints.samplerate, pkt->hints.bitrate, pkt->hints.bitspersample); CloseDecoder(); CloseAudioCodec(); m_hints = pkt->hints; m_player_error = OpenAudioCodec(); if(!m_player_error) return false; m_player_error = OpenDecoder(); if(!m_player_error) return false; } CLog::Log(LOGINFO, "CDVDPlayerAudio::Decode dts:%.0f pts:%.0f size:%d", pkt->dts, pkt->pts, pkt->size); if(pkt->pts != DVD_NOPTS_VALUE) m_iCurrentPts = pkt->pts; else if(pkt->dts != DVD_NOPTS_VALUE) m_iCurrentPts = pkt->dts; const uint8_t *data_dec = pkt->data; int data_len = pkt->size; if(!m_passthrough && !m_hw_decode) { while(data_len > 0) { int len = m_pAudioCodec->Decode((BYTE *)data_dec, data_len); if( (len < 0) || (len > data_len) ) { m_pAudioCodec->Reset(); break; } data_dec+= len; data_len -= len; uint8_t *decoded; int decoded_size = m_pAudioCodec->GetData(&decoded); if(decoded_size <=0) continue; while((int) m_decoder->GetSpace() < decoded_size) { OMXClock::OMXSleep(10); if(m_flush_requested) return true; } int ret = 0; ret = m_decoder->AddPackets(decoded, decoded_size, pkt->dts, pkt->pts); if(ret != decoded_size) { printf("error ret %d decoded_size %d\n", ret, decoded_size); } } } else { while((int) m_decoder->GetSpace() < pkt->size) { OMXClock::OMXSleep(10); if(m_flush_requested) return true; } m_decoder->AddPackets(pkt->data, pkt->size, pkt->dts, pkt->pts); } return true; }