diff --git a/encoder/vaapiencoder_base.cpp b/encoder/vaapiencoder_base.cpp index a7c1e895..b3eaedea 100644 --- a/encoder/vaapiencoder_base.cpp +++ b/encoder/vaapiencoder_base.cpp @@ -412,7 +412,8 @@ SurfacePtr VaapiEncoderBase::createSurface(VideoFrameRawData* frame) VAImage image; VADisplay display = m_display->getID(); - uint8_t* dest = mapSurfaceToImage(display, surface->getID(), image); + uint8_t* dest = mapSurfaceToImage(display, surface->getID(), image, + frame->width, frame->height, fourcc); if (!dest) { ERROR("map image failed"); return nil; diff --git a/vaapi/VaapiUtils.cpp b/vaapi/VaapiUtils.cpp index accbe45f..0c328e09 100644 --- a/vaapi/VaapiUtils.cpp +++ b/vaapi/VaapiUtils.cpp @@ -23,12 +23,26 @@ namespace YamiMediaCodec { -uint8_t* mapSurfaceToImage(VADisplay display, intptr_t surface, VAImage& image) +uint8_t* mapSurfaceToImage(VADisplay display, intptr_t surface, VAImage& image, + uint32_t width, uint32_t height, uint32_t fourcc) { uint8_t* p = NULL; - VAStatus status = vaDeriveImage(display, (VASurfaceID)surface, &image); - if (!checkVaapiStatus(status, "vaDeriveImage")) - return NULL; + VAStatus status; + if (width == 0 && height == 0 && fourcc == 0) { + status = vaDeriveImage(display, (VASurfaceID)surface, &image); + if (!checkVaapiStatus(status, "vaDeriveImage")) + return NULL; + } else { + VAImageFormat format; + format.fourcc = fourcc; + status = vaCreateImage(display, &format, width, height, &image); + if (!checkVaapiStatus(status, "vaCreateImage")) + return NULL; + status = vaPutImage(display, (VASurfaceID)surface, image.image_id, 0, 0, + width, height, 0, 0, width, height); + if (!checkVaapiStatus(status, "vaPutImage")) + return NULL; + } status = vaMapBuffer(display, image.buf, (void**)&p); if (!checkVaapiStatus(status, "vaMapBuffer")) { checkVaapiStatus(vaDestroyImage(display, image.image_id), "vaDestroyImage"); diff --git a/vaapi/VaapiUtils.h b/vaapi/VaapiUtils.h index da35f8cb..bac2902b 100644 --- a/vaapi/VaapiUtils.h +++ b/vaapi/VaapiUtils.h @@ -22,7 +22,8 @@ namespace YamiMediaCodec { -uint8_t* mapSurfaceToImage(VADisplay display, intptr_t surface, VAImage& image); +uint8_t* mapSurfaceToImage(VADisplay display, intptr_t surface, VAImage& image, + uint32_t width = 0, uint32_t height = 0, uint32_t fourcc = 0); void unmapImage(VADisplay display, const VAImage& image);