void CMMALRenderer::vout_input_port_cb(MMAL_PORT_T *port, MMAL_BUFFER_HEADER_T *buffer) { assert(!(buffer->flags & MMAL_BUFFER_HEADER_FLAG_TRANSMISSION_FAILED)); buffer->flags &= ~MMAL_BUFFER_HEADER_FLAG_USER2; if (m_format == RENDER_FMT_MMAL) { CMMALVideoBuffer *omvb = (CMMALVideoBuffer *)buffer->user_data; assert(buffer == omvb->mmal_buffer); #if defined(MMAL_DEBUG_VERBOSE) CLog::Log(LOGDEBUG, "%s::%s port:%p omvb:%p mmal:%p len:%d cmd:%x flags:%x flight:%d", CLASSNAME, __func__, port, omvb, omvb->mmal_buffer, buffer->length, buffer->cmd, buffer->flags, m_inflight); #endif omvb->Release(); } else if (m_format == RENDER_FMT_YUV420P) { CYUVVideoBuffer *omvb = (CYUVVideoBuffer *)buffer->user_data; assert(buffer == omvb->mmal_buffer); #if defined(MMAL_DEBUG_VERBOSE) CLog::Log(LOGDEBUG, "%s::%s port:%p omvb:%p mmal:%p len:%d cmd:%x flags:%x flight:%d", CLASSNAME, __func__, port, omvb, omvb->mmal_buffer, buffer->length, buffer->cmd, buffer->flags, m_inflight); #endif m_inflight--; omvb->Release(); } else assert(0); }
void CMMALVideo::Reset(void) { CSingleLock lock(m_sharedSection); if (g_advancedSettings.CanLogComponent(LOGVIDEO)) CLog::Log(LOGDEBUG, "%s::%s", CLASSNAME, __func__); if (m_dec_input && m_dec_input->is_enabled) mmal_port_disable(m_dec_input); if (m_deint_connection && m_deint_connection->is_enabled) mmal_connection_disable(m_deint_connection); if (m_dec_output && m_dec_output->is_enabled) mmal_port_disable(m_dec_output); if (!m_finished) { if (m_dec_input) mmal_port_enable(m_dec_input, dec_input_port_cb_static); if (m_deint_connection) mmal_connection_enable(m_deint_connection); if (m_dec_output) mmal_port_enable(m_dec_output, dec_output_port_cb_static); } // blow all ready video frames while (1) { CMMALVideoBuffer *buffer = NULL; { CSingleLock lock(m_output_mutex); // fetch a output buffer and pop it off the ready list if (!m_output_ready.empty()) { buffer = m_output_ready.front(); m_output_ready.pop(); } m_output_cond.notifyAll(); } if (buffer) { buffer->Acquire(); buffer->Release(); } else break; } if (!m_finished) { SendCodecConfigData(); Prime(); } m_decoderPts = DVD_NOPTS_VALUE; m_demuxerPts = DVD_NOPTS_VALUE; m_codecControlFlags = 0; m_dropState = false; m_num_decoded = 0; m_got_eos = false; m_packet_num = 0; m_packet_num_eos = ~0; m_preroll = !m_hints.stills && (m_speed == DVD_PLAYSPEED_NORMAL || m_speed == DVD_PLAYSPEED_PAUSE); }
void CMMALRenderer::Process() { MMAL_BUFFER_HEADER_T *buffer; while (buffer = mmal_queue_wait(m_release_queue), buffer && buffer != &m_quit_packet) { CMMALVideoBuffer *omvb = (CMMALVideoBuffer *)buffer->user_data; omvb->Release(); } m_sync.Set(); }
void CMMALRenderer::AddVideoPictureHW(DVDVideoPicture& pic, int index) { CMMALVideoBuffer *buffer = pic.MMALBuffer; #if defined(MMAL_DEBUG_VERBOSE) CLog::Log(LOGDEBUG, "%s::%s - %p (%p) %i", CLASSNAME, __func__, buffer, buffer->mmal_buffer, index); #endif YUVBUFFER &buf = m_buffers[index]; assert(!buf.MMALBuffer); memset(&buf, 0, sizeof buf); buf.MMALBuffer = buffer->Acquire(); }
void CMMALVideo::Reset(void) { CSingleLock lock(m_sharedSection); if (g_advancedSettings.CanLogComponent(LOGVIDEO)) CLog::Log(LOGDEBUG, "%s::%s", CLASSNAME, __func__); if (m_dec_input && m_dec_input->is_enabled) mmal_port_disable(m_dec_input); if (m_deint_connection && m_deint_connection->is_enabled) mmal_connection_disable(m_deint_connection); if (m_dec_output && m_dec_output->is_enabled) mmal_port_disable(m_dec_output); if (!m_finished) { if (m_dec_input) mmal_port_enable(m_dec_input, dec_input_port_cb_static); if (m_deint_connection) mmal_connection_enable(m_deint_connection); if (m_dec_output) mmal_port_enable(m_dec_output, dec_output_port_cb_static); } // blow all ready video frames while (1) { CMMALVideoBuffer *buffer = NULL; pthread_mutex_lock(&m_output_mutex); // fetch a output buffer and pop it off the ready list if (!m_output_ready.empty()) { buffer = m_output_ready.front(); m_output_ready.pop(); } pthread_mutex_unlock(&m_output_mutex); if (buffer) { buffer->Acquire(); buffer->Release(); } else break; } if (!m_finished) { SendCodecConfigData(); Prime(); } m_decoderPts = DVD_NOPTS_VALUE; m_demuxerPts = DVD_NOPTS_VALUE; }