Exemplo n.º 1
0
// Slots
void Window::runEncode()
{
    emit startEncode();
}
/*==============================================================================
* Function : encodeImage
* Parameters: OMX_BUFFERHEADERTYPE *a_inBuffer - Input Buffer passed during
* ETB, OMX_BUFFERHEADERTYPE *a_outBuffer - O/p buffer passed during FTB
* Return Value : OMX_ERRORTYPE
* Description: Start Image Encoding
==============================================================================*/
OMX_ERRORTYPE OMXJpegEncoder::encodeImage(
  OMX_BUFFERHEADERTYPE *a_inBuffer,
  OMX_BUFFERHEADERTYPE *a_inTmbBuffer,
  OMX_BUFFERHEADERTYPE *a_outBuffer)
{
  OMX_ERRORTYPE lret = OMX_ErrorNone;

  if (!a_inBuffer || !a_outBuffer) {
    QIDBG_ERROR("%s:%d] Bad parameter",  __func__, __LINE__);
    return OMX_ErrorBadParameter;
  }
  if (m_state == OMX_StateInvalid) {
    QIDBG_ERROR("%s:%d] Invalid State",  __func__, __LINE__);
    return OMX_ErrorInvalidState;
  }

  pthread_mutex_lock(&m_abortlock);
  m_releaseFlag = OMX_FALSE;
  if (!m_abort_flag) {

    m_mainEncodingComplete = OMX_FALSE;
    if ((m_mainEncodeParams.Rotation() != (uint32_t)m_rotation.nRotation) &&
        (!m_mainEncodeParams.Rotation() || !m_rotation.nRotation)) {
      if (NULL != m_mainEncoder) {
        delete m_mainEncoder;
        m_mainEncoder = NULL;
      }
    }
    lret = configureEncodedata();
    if (lret != OMX_ErrorNone) {
      QIDBG_ERROR("%s:%d] Error in Encode configuration", __func__, __LINE__);
      goto error;
    }
    lret = configureBuffers(a_inBuffer, a_outBuffer);
    if (lret != OMX_ErrorNone) {
      QIDBG_ERROR("%s:%d] Error in Encode buffer configuration", __func__, __LINE__);
      goto error;
    }
    if ((m_thumbnailInfo.input_height != 0) &&
      (m_thumbnailInfo.input_width != 0)) {
      // Configure thumbnail buffer
      m_thumbEncodingComplete = OMX_FALSE;
      lret = configureTmbBuffer(a_inTmbBuffer);
      if (lret != OMX_ErrorNone) {
        QIDBG_ERROR("%s:%d] Error in Thumbnail bufffer configuration",
            __func__, __LINE__);
        goto error;
      }

      lret = configureThumbnailData();
      if (lret != OMX_ErrorNone) {
        QIDBG_ERROR("%s:%d] Error in Encode configuration", __func__, __LINE__);
        goto error;
      }

      /* Monochrome can only be encoded with HW encoder. Thus, switch to
         serial and use the HW for both thumbnail and main*/
      if (m_thumbFormat == QI_MONOCHROME) {
         m_encoding_mode = OMX_Serial_Encoding;
      }

      /* If Parallel encoding is enabled, encode both main image and thumbnail
         in parallel. Start main image first followed by thumbnail */
      if (m_encoding_mode == OMX_Parallel_Encoding) {
        lret = startEncode();
        if (lret != OMX_ErrorNone) {
          QIDBG_ERROR("%s:%d] Error in Start Encode", __func__, __LINE__);
          goto error;
        }
        lret = startThumbnailEncode();
        if (lret != OMX_ErrorNone) {
          QIDBG_ERROR("%s:%d] Error in Starting thumbnail encode",
            __func__, __LINE__);
          goto error;
        }
      } else {
        /*If serial encoding start thumbnail first*/
        lret = startThumbnailEncode();
        if (lret != OMX_ErrorNone) {
          QIDBG_ERROR("%s:%d] Error in Starting thumbnail encode",
            __func__, __LINE__);
          goto error;
        }
      }
    } else {
      /*If thumbnail is not present we call write exif from
        here with thumbnail as NULL*/
      if (NULL == m_memOps.get_memory) {
        lret = writeExifData(NULL, m_outputQIBuffer);
        if (lret != OMX_ErrorNone) {
          QIDBG_ERROR("%s:%d] Error in Exif Composer", __func__, __LINE__);
          goto error;
        }
        QIDBG_MED("%s:%d] Finished writing Exif", __func__, __LINE__);
      }
      lret = startEncode();
      if (lret != OMX_ErrorNone) {
        QIDBG_ERROR("%s:%d] Error in Start Encode", __func__, __LINE__);
        goto error;
      }
    }
  }

error:
  pthread_mutex_unlock(&m_abortlock);
  return lret;
}