bool OMXPlayerAudio::Decode(DemuxPacket *pkt, bool bDropPacket) { if(!pkt || m_bad_state || !m_pAudioCodec) return false; if(pkt->dts != DVD_NOPTS_VALUE) m_audioClock = pkt->dts; const uint8_t *data_dec = pkt->pData; int data_len = pkt->iSize; if(!OMX_IS_RAW(m_format.m_dataFormat)) { while(!m_bStop && 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; m_audioStats.AddSampleBytes(decoded_size); if(CodecChange()) { m_DecoderOpen = OpenDecoder(); if(!m_DecoderOpen) return false; } while(!m_bStop) { HandlePlayspeed(bDropPacket); if(m_flush) { m_flush = false; break; } if(m_omxAudio.GetSpace() < (unsigned int)pkt->iSize) { Sleep(10); continue; } if(!bDropPacket) { // Zero out the frame data if we are supposed to silence the audio if(m_silence) memset(decoded, 0x0, decoded_size); ret = m_omxAudio.AddPackets(decoded, decoded_size, m_audioClock, m_audioClock); if(ret != decoded_size) { CLog::Log(LOGERROR, "error ret %d decoded_size %d\n", ret, decoded_size); } } int n = (m_nChannels * m_hints.bitspersample * m_hints.samplerate)>>3; if (n > 0) m_audioClock += ((double)decoded_size * DVD_TIME_BASE) / n; if(m_speed == DVD_PLAYSPEED_NORMAL) HandleSyncError((((double)decoded_size * DVD_TIME_BASE) / n)); break; } } } else { if(CodecChange())
bool OMXPlayerAudio::Decode(DemuxPacket *pkt, bool bDropPacket) { if(!pkt || m_bad_state || !m_pAudioCodec) return false; if(pkt->dts != DVD_NOPTS_VALUE) m_audioClock = pkt->dts; const uint8_t *data_dec = pkt->pData; int data_len = pkt->iSize; if(!OMX_IS_RAW(m_format.m_dataFormat) && !bDropPacket) { while(!m_bStop && 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; m_audioStats.AddSampleBytes(decoded_size); if(CodecChange()) { m_DecoderOpen = OpenDecoder(); if(!m_DecoderOpen) return false; } while(!m_bStop) { // discard if flushing as clocks may be stopped and we'll never submit it if(m_flush) break; if(m_omxAudio.GetSpace() < (unsigned int)decoded_size) { Sleep(10); continue; } if(!bDropPacket) { // Zero out the frame data if we are supposed to silence the audio if(m_silence) memset(decoded, 0x0, decoded_size); ret = m_omxAudio.AddPackets(decoded, decoded_size, m_audioClock, m_audioClock); if(ret != decoded_size) { CLog::Log(LOGERROR, "error ret %d decoded_size %d\n", ret, decoded_size); } } break; } } } else if(!bDropPacket) { if(CodecChange()) { m_DecoderOpen = OpenDecoder(); if(!m_DecoderOpen) return false; } while(!m_bStop) { if(m_flush) break; if(m_omxAudio.GetSpace() < (unsigned int)pkt->iSize) { Sleep(10); continue; } if(!bDropPacket) { if(m_silence) memset(pkt->pData, 0x0, pkt->iSize); m_omxAudio.AddPackets(pkt->pData, pkt->iSize, m_audioClock, m_audioClock); } m_audioStats.AddSampleBytes(pkt->iSize); break; } } if(bDropPacket) m_stalled = false; // signal to our parent that we have initialized if(m_started == false) { m_started = true; m_messageParent.Put(new CDVDMsgInt(CDVDMsg::PLAYER_STARTED, DVDPLAYER_AUDIO)); } return true; }