使用ffmpeg解碼並把解碼後的yuv數據傳遞給media硬編碼所用的mfxFrameSurface1結構體

下面的部分代碼記錄

   /*
    *m_pEncSurfaces = new mfxFrameSurface1[4],4對應着EncodeParams結構體裏nAsyncDepth值
    *分配好Y,U,V的內存
    */
    /*
    *分配編碼器需要用到的內存
    */
	mfxFrameSurface1* m_pEncSurfaces = NULL;
    m_pEncSurfaces = new mfxFrameSurface1[4];
	MSDK_CHECK_POINTER(m_pEncSurfaces, MFX_ERR_MEMORY_ALLOC);
	mfxU8* surfaceBuffers = (mfxU8 *)new mfxU8[(ffmpeg_dectx->width*ffmpeg_dectx->height * 12) / 8 * 4];
	for (int i = 0; i < 4; i++)
	{
		memset(&(m_pEncSurfaces[i]), 0, sizeof(mfxFrameSurface1));
		MSDK_MEMCPY_VAR(m_pEncSurfaces[i].Info, &(pPipeline->m_mfxEncParams.mfx.FrameInfo), sizeof(mfxFrameInfo));
		//m_pEncSurfaces[i]
		m_pEncSurfaces[i].Data.Y = &surfaceBuffers[(ffmpeg_dectx->width*ffmpeg_dectx->height * 12) / 8 * i];
		m_pEncSurfaces[i].Data.U = m_pEncSurfaces[i].Data.Y + ffmpeg_dectx->width * ffmpeg_dectx->height;
		m_pEncSurfaces[i].Data.V = m_pEncSurfaces[i].Data.U + 1;
		m_pEncSurfaces[i].Data.Pitch = ffmpeg_dectx->width;
	}
/*
 *libyuv::I420ToNV12是libyuv庫的函數
 *mfxFrameSurface1裏Data.UV數據和Y數據就是NV12
 */
 int m_decodec_flag = 0;
 if (0 > avcodec_decode_video2(ffmpeg_dectx, m_frame, &m_decodec_flag, &packet)) 
 {
	std::cout << "decodec error" << std::endl;
	return -1;
 }
  if (m_decodec_flag)
  {
		sws_scale(img_convert_ctx, (const uint8_t* const*)m_frame->data, m_frame->linesize, 0, ffmpeg_dectx->height, m_yuvframe->data, m_yuvframe->linesize);
	    //YUV轉NV12
		libyuv::I420ToNV12(m_yuvframe->data[0], ffmpeg_dectx->width,
					m_yuvframe->data[1], ffmpeg_dectx->width >> 1,
					m_yuvframe->data[2], ffmpeg_dectx->width >> 1,
					(uint8_t*)m_pEncSurfaces->Data.Y, ffmpeg_dectx->width,
					(uint8_t*)m_pEncSurfaces->Data.UV, ffmpeg_dectx->width,
					ffmpeg_dectx->width, ffmpeg_dectx->height);
  }

 

發表評論
所有評論
還沒有人評論,想成為第一個評論的人麼? 請在上方評論欄輸入並且點擊發布.
相關文章