Я использую FFMPEG для декодирования данных H264. Почему libyuv: i420ToARGb работает так медленно. Для преобразования кадра требуется 4.5MS , 40000-450000 микросекунд. Нативное преобразование функции Sws_scale в FLMPEG составляет около 3000 микросекунд. Это мой код.
if (av_read_frame(pFormatCtx, vPacket) >= 0) {
if ((vPacket)->stream_index != videoindex) {
continue;
}
avcodec_send_packet(pCodecCtx, vPacket);
int ret = avcodec_receive_frame(pCodecCtx, vFrame);
if (ret < 0 && ret != AVERROR_EOF) {
av_packet_unref(vPacket);
continue;
}
long thisTime = getTime();
// sws_scale(img_convert_ctx, vFrame->data, vFrame->linesize,
// 0,
// pCodecCtx->height,
// pFrameRGBA->data, pFrameRGBA->linesize);
int re = libyuv::I420ToARGB(vFrame->data[0], vFrame->linesize[0],
vFrame->data[2], vFrame->linesize[2],
vFrame->data[1], vFrame->linesize[1],
pFrameRGBA->data[0], pFrameRGBA->linesize[0],
pCodecCtx->width, pCodecCtx->height);
long newTime = getTime();
LOGE("runing Time:%d", newTime - thisTime);
if (ANativeWindow_lock(nativeWindow, &windowBuffer, nullptr) < 0) {
} else {
av_image_fill_arrays(pFrameRGBA->data, pFrameRGBA->linesize,
(const uint8_t *) windowBuffer.bits, AV_PIX_FMT_RGBA,
pCodecCtx->width, pCodecCtx->height, 1);
ANativeWindow_unlockAndPost(nativeWindow);
}
};