初始化解码器:
void VideoDecoder::Init(int width, int height, int buffNumber)
{
DM_NATIVE_PRINT("VideoDecoder::Init Start... %dx%d", width, height);
imageW = width;
imageH = height;
//带解码图像队列个数
mMaxBufferNumber = buffNumber;
mInputDataList = new DmSyncQueue<InputData_t>(buffNumber);
mOutputDataList = new DmSyncQueue<InputData_t>(buffNumber);
//解码器为H264解码类型
const char* mine = "video/avc";
//创建解码器
mMediaCodec = AMediaCodec_createDecoderByType(mine);
AMediaFormat* videoFormat = AMediaFormat_new();
AMediaFormat_setString(videoFormat, "mime", mine);
AMediaFormat_setInt32(videoFormat, AMEDIAFORMAT_KEY_WIDTH, width); // 视频宽度
AMediaFormat_setInt32(videoFormat, AMEDIAFORMAT_KEY_HEIGHT, height); // 视频高度
//设置PPS和SPS
if (videoCsd0 != NULL) {
AMediaFormat_setBuffer(videoFormat, "csd-0", videoCsd0, videoCsd0Size);
DM_NATIVE_PRINT(" videoCsd0 = %d\n", videoCsd0Size);
}
if (videoCsd1 != NULL) {
AMediaFormat_setBuffer(videoFormat, "csd-1", videoCsd1, videoCsd1Size);
DM_NATIVE_PRINT(" videoCsd1 = %d\n", videoCsd1Size);
}
//不需要设置图像格式
//AMediaFormat_setInt32(videoFormat, AMEDIAFORMAT_KEY_COLOR_FORMAT, 21);
//配置解码器
media_status_t status = AMediaCodec_configure(mMediaCodec, videoFormat, NULL, NULL, 0);
if (status != AMEDIA_OK)
{
DM_NATIVE_ERR_PRINT("AMediaCodec_configure() failed with error %i for format %u", (int)status, 21);
} else {
//开始解码器状态机
status = AMediaCodec_start(mMediaCodec);
if (status != AMEDIA_OK)
{
DM_NATIVE_ERR_PRINT("AMediaCodec_start: Could not start decoder.");
}
run = true;
//创建解码线程
mLoopThread = new std::thread(&Vide