@@ -427,6 +427,7 @@ void avcodec_register_all(void) | |||||
REGISTER_ENCODER(LIBVO_AMRWBENC, libvo_amrwbenc); | REGISTER_ENCODER(LIBVO_AMRWBENC, libvo_amrwbenc); | ||||
REGISTER_ENCODER(LIBVORBIS, libvorbis); | REGISTER_ENCODER(LIBVORBIS, libvorbis); | ||||
REGISTER_ENCDEC (LIBVPX, libvpx); | REGISTER_ENCDEC (LIBVPX, libvpx); | ||||
REGISTER_ENCDEC (LIBVPX, libvpx_vp9); | |||||
REGISTER_ENCODER(LIBX264, libx264); | REGISTER_ENCODER(LIBX264, libx264); | ||||
REGISTER_ENCODER(LIBXAVS, libxavs); | REGISTER_ENCODER(LIBXAVS, libxavs); | ||||
REGISTER_ENCODER(LIBXVID, libxvid); | REGISTER_ENCODER(LIBXVID, libxvid); | ||||
@@ -1012,6 +1012,13 @@ static const AVCodecDescriptor codec_descriptors[] = { | |||||
.long_name = NULL_IF_CONFIG_SMALL("On2 VP8"), | .long_name = NULL_IF_CONFIG_SMALL("On2 VP8"), | ||||
.props = AV_CODEC_PROP_LOSSY, | .props = AV_CODEC_PROP_LOSSY, | ||||
}, | }, | ||||
{ | |||||
.id = AV_CODEC_ID_VP9, | |||||
.type = AVMEDIA_TYPE_VIDEO, | |||||
.name = "vp9", | |||||
.long_name = NULL_IF_CONFIG_SMALL("Google VP9"), | |||||
.props = AV_CODEC_PROP_LOSSY, | |||||
}, | |||||
{ | { | ||||
.id = AV_CODEC_ID_PICTOR, | .id = AV_CODEC_ID_PICTOR, | ||||
.type = AVMEDIA_TYPE_VIDEO, | .type = AVMEDIA_TYPE_VIDEO, | ||||
@@ -35,10 +35,10 @@ typedef struct VP8DecoderContext { | |||||
struct vpx_codec_ctx decoder; | struct vpx_codec_ctx decoder; | ||||
} VP8Context; | } VP8Context; | ||||
static av_cold int vp8_init(AVCodecContext *avctx) | |||||
static av_cold int vpx_init(AVCodecContext *avctx, | |||||
const struct vpx_codec_iface *iface) | |||||
{ | { | ||||
VP8Context *ctx = avctx->priv_data; | VP8Context *ctx = avctx->priv_data; | ||||
const struct vpx_codec_iface *iface = &vpx_codec_vp8_dx_algo; | |||||
struct vpx_codec_dec_cfg deccfg = { | struct vpx_codec_dec_cfg deccfg = { | ||||
/* token partitions+1 would be a decent choice */ | /* token partitions+1 would be a decent choice */ | ||||
.threads = FFMIN(avctx->thread_count, 16) | .threads = FFMIN(avctx->thread_count, 16) | ||||
@@ -58,6 +58,11 @@ static av_cold int vp8_init(AVCodecContext *avctx) | |||||
return 0; | return 0; | ||||
} | } | ||||
static av_cold int vp8_init(AVCodecContext *avctx) | |||||
{ | |||||
return vpx_init(avctx, &vpx_codec_vp8_dx_algo); | |||||
} | |||||
static int vp8_decode(AVCodecContext *avctx, | static int vp8_decode(AVCodecContext *avctx, | ||||
void *data, int *got_frame, AVPacket *avpkt) | void *data, int *got_frame, AVPacket *avpkt) | ||||
{ | { | ||||
@@ -123,3 +128,20 @@ AVCodec ff_libvpx_decoder = { | |||||
.capabilities = CODEC_CAP_AUTO_THREADS, | .capabilities = CODEC_CAP_AUTO_THREADS, | ||||
.long_name = NULL_IF_CONFIG_SMALL("libvpx VP8"), | .long_name = NULL_IF_CONFIG_SMALL("libvpx VP8"), | ||||
}; | }; | ||||
static av_cold int vp9_init(AVCodecContext *avctx) | |||||
{ | |||||
return vpx_init(avctx, &vpx_codec_vp9_dx_algo); | |||||
} | |||||
AVCodec ff_libvpx_vp9_decoder = { | |||||
.name = "libvpx-vp9", | |||||
.type = AVMEDIA_TYPE_VIDEO, | |||||
.id = AV_CODEC_ID_VP9, | |||||
.priv_data_size = sizeof(VP8Context), | |||||
.init = vp9_init, | |||||
.close = vp8_free, | |||||
.decode = vp8_decode, | |||||
.capabilities = CODEC_CAP_AUTO_THREADS | CODEC_CAP_EXPERIMENTAL, | |||||
.long_name = NULL_IF_CONFIG_SMALL("libvpx VP9"), | |||||
}; |
@@ -214,10 +214,10 @@ static av_cold int vp8_free(AVCodecContext *avctx) | |||||
return 0; | return 0; | ||||
} | } | ||||
static av_cold int vp8_init(AVCodecContext *avctx) | |||||
static av_cold int vpx_init(AVCodecContext *avctx, | |||||
const struct vpx_codec_iface *iface) | |||||
{ | { | ||||
VP8Context *ctx = avctx->priv_data; | VP8Context *ctx = avctx->priv_data; | ||||
const struct vpx_codec_iface *iface = &vpx_codec_vp8_cx_algo; | |||||
struct vpx_codec_enc_cfg enccfg; | struct vpx_codec_enc_cfg enccfg; | ||||
int res; | int res; | ||||
@@ -362,6 +362,11 @@ static av_cold int vp8_init(AVCodecContext *avctx) | |||||
return 0; | return 0; | ||||
} | } | ||||
static av_cold int vp8_init(AVCodecContext *avctx) | |||||
{ | |||||
return vpx_init(avctx, &vpx_codec_vp8_cx_algo); | |||||
} | |||||
static inline void cx_pktcpy(struct FrameListData *dst, | static inline void cx_pktcpy(struct FrameListData *dst, | ||||
const struct vpx_codec_cx_pkt *src) | const struct vpx_codec_cx_pkt *src) | ||||
{ | { | ||||
@@ -594,3 +599,32 @@ AVCodec ff_libvpx_encoder = { | |||||
.priv_class = &class, | .priv_class = &class, | ||||
.defaults = defaults, | .defaults = defaults, | ||||
}; | }; | ||||
static av_cold int vp9_init(AVCodecContext *avctx) | |||||
{ | |||||
return vpx_init(avctx, &vpx_codec_vp9_cx_algo); | |||||
} | |||||
static const AVClass class_vp9 = { | |||||
.class_name = "libvpx encoder", | |||||
.item_name = av_default_item_name, | |||||
.option = options, | |||||
.version = LIBAVUTIL_VERSION_INT, | |||||
}; | |||||
AVCodec ff_libvpx_vp9_encoder = { | |||||
.name = "libvpx-vp9", | |||||
.type = AVMEDIA_TYPE_VIDEO, | |||||
.id = AV_CODEC_ID_VP9, | |||||
.priv_data_size = sizeof(VP8Context), | |||||
.init = vp9_init, | |||||
.encode2 = vp8_encode, | |||||
.close = vp8_free, | |||||
.capabilities = CODEC_CAP_DELAY | CODEC_CAP_AUTO_THREADS | CODEC_CAP_EXPERIMENTAL, | |||||
.pix_fmts = (const enum AVPixelFormat[]){ AV_PIX_FMT_YUV420P, AV_PIX_FMT_NONE }, | |||||
.long_name = NULL_IF_CONFIG_SMALL("libvpx VP9"), | |||||
.priv_class = &class_vp9, | |||||
.defaults = defaults, | |||||
}; |