| @@ -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, | |||||
| }; | |||||