#include "libavutil/imgutils.h"
#include "libavutil/intreadwrite.h"
#include "avcodec.h"
+#include "decode.h"
#include "internal.h"
#include "libvpx.h"
#include "profiles.h"
struct vpx_image *img, *img_alpha;
int ret;
uint8_t *side_data = NULL;
- int side_data_size = 0;
+ size_t side_data_size;
ret = decode_frame(avctx, &ctx->decoder, avpkt->data, avpkt->size);
if (ret)
return ret;
}
+ if (ctx->has_alpha_channel &&
+ (img->d_w != img_alpha->d_w ||
+ img->d_h != img_alpha->d_h ||
+ img->bit_depth != img_alpha->bit_depth)) {
+ av_log(avctx, AV_LOG_ERROR,
+ "Video dimensions %dx%d@%dbpc differ from alpha dimensions %dx%d@%dbpc\n",
+ img->d_w, img->d_h, img->bit_depth,
+ img_alpha->d_w, img_alpha->d_h, img_alpha->bit_depth);
+ return AVERROR_INVALIDDATA;
+ }
+
planes[0] = img->planes[VPX_PLANE_Y];
planes[1] = img->planes[VPX_PLANE_U];
planes[2] = img->planes[VPX_PLANE_V];
return vpx_init(avctx, &ctx->decoder, &vpx_codec_vp8_dx_algo);
}
-AVCodec ff_libvpx_vp8_decoder = {
+const AVCodec ff_libvpx_vp8_decoder = {
.name = "libvpx",
.long_name = NULL_IF_CONFIG_SMALL("libvpx VP8"),
.type = AVMEDIA_TYPE_VIDEO,
.init = vp8_init,
.close = vpx_free,
.decode = vpx_decode,
- .capabilities = AV_CODEC_CAP_AUTO_THREADS | AV_CODEC_CAP_DR1,
+ .capabilities = AV_CODEC_CAP_OTHER_THREADS | AV_CODEC_CAP_DR1,
+ .caps_internal = FF_CODEC_CAP_AUTO_THREADS,
.wrapper_name = "libvpx",
};
#endif /* CONFIG_LIBVPX_VP8_DECODER */
.init = vp9_init,
.close = vpx_free,
.decode = vpx_decode,
- .capabilities = AV_CODEC_CAP_AUTO_THREADS,
+ .capabilities = AV_CODEC_CAP_OTHER_THREADS,
+ .caps_internal = FF_CODEC_CAP_AUTO_THREADS,
.init_static_data = ff_vp9_init_static,
.profiles = NULL_IF_CONFIG_SMALL(ff_vp9_profiles),
.wrapper_name = "libvpx",