Unified · Split
| @@ -10,7 +10,7 @@ version <next>: · 9 unmodified lines | ||
| 10 | 10 | - curves filter doesn't automatically insert points at x=0 and x=1 anymore |
| 11 | 11 | - 16-bit support in curves filter and selectivecolor filter |
| 12 | 12 | - OpenH264 decoder wrapper |
| 13 | −- MediaCodec H.264 and HEVC hwaccel | |
| 13 | +- MediaCodec H.264/HEVC/VP8/VP9 hwaccel | |
| 14 | 14 | - True Audio (TTA) muxer |
| 15 | 15 | - crystalizer audio filter |
| 16 | 16 | - acrusher audio filter |
| @@ -28,7 +28,7 @@ version <next>: · 11 unmodified lines | ||
| 28 | 28 | - gblur filter |
| 29 | 29 | - avgblur filter |
| 30 | 30 | - sobel and prewitt filter |
| 31 | −- MediaCodec HEVC decoding | |
| 31 | +- MediaCodec HEVC/VP8/VP9 decoding | |
| 32 | 32 | - Meridian Lossless Packing (MLP) / TrueHD encoder |
| 33 | 33 | - Non-Local Means (nlmeans) denoising filter |
| 34 | 34 | - sdl2 output device and ffplay support |
| @@ -2662,10 +2662,14 @@ vc1_vdpau_hwaccel_deps="vdpau" · 2661 unmodified lines | ||
| 2662 | 2662 | vc1_vdpau_hwaccel_select="vc1_decoder" |
| 2663 | 2663 | vp8_cuvid_hwaccel_deps="cuda cuvid" |
| 2664 | 2664 | vp9_cuvid_hwaccel_deps="cuda cuvid" |
| 2665 | +vp8_mediacodec_decoder_deps="mediacodec" | |
| 2666 | +vp8_mediacodec_hwaccel_deps="mediacodec" | |
| 2665 | 2667 | vp9_d3d11va_hwaccel_deps="d3d11va DXVA_PicParams_VP9" |
| 2666 | 2668 | vp9_d3d11va_hwaccel_select="vp9_decoder" |
| 2667 | 2669 | vp9_dxva2_hwaccel_deps="dxva2 DXVA_PicParams_VP9" |
| 2668 | 2670 | vp9_dxva2_hwaccel_select="vp9_decoder" |
| 2671 | +vp9_mediacodec_decoder_deps="mediacodec" | |
| 2672 | +vp9_mediacodec_hwaccel_deps="mediacodec" | |
| 2669 | 2673 | vp9_vaapi_hwaccel_deps="vaapi VADecPictureParameterBufferVP9" |
| 2670 | 2674 | vp9_vaapi_hwaccel_select="vp9_decoder" |
| 2671 | 2675 | wmv3_crystalhd_decoder_select="crystalhd" |
| @@ -595,9 +595,11 @@ OBJS-$(CONFIG_VP6_DECODER) += vp6.o vp56.o vp56data.o \ · 594 unmodified lines | ||
| 595 | 595 | OBJS-$(CONFIG_VP7_DECODER) += vp8.o vp56rac.o |
| 596 | 596 | OBJS-$(CONFIG_VP8_DECODER) += vp8.o vp56rac.o |
| 597 | 597 | OBJS-$(CONFIG_VP8_CUVID_DECODER) += cuvid.o |
| 598 | +OBJS-$(CONFIG_VP8_MEDIACODEC_DECODER) += mediacodecdec_h2645.o | |
| 598 | 599 | OBJS-$(CONFIG_VP9_DECODER) += vp9.o vp9dsp.o vp56rac.o vp9dsp_8bpp.o \ |
| 599 | 600 | vp9dsp_10bpp.o vp9dsp_12bpp.o |
| 600 | 601 | OBJS-$(CONFIG_VP9_CUVID_DECODER) += cuvid.o |
| 602 | +OBJS-$(CONFIG_VP9_MEDIACODEC_DECODER) += mediacodecdec_h2645.o | |
| 601 | 603 | OBJS-$(CONFIG_VPLAYER_DECODER) += textdec.o ass.o |
| 602 | 604 | OBJS-$(CONFIG_VQA_DECODER) += vqavideo.o |
| 603 | 605 | OBJS-$(CONFIG_WAVPACK_DECODER) += wavpack.o |
| @@ -115,9 +115,11 @@ void avcodec_register_all(void) · 114 unmodified lines | ||
| 115 | 115 | REGISTER_HWACCEL(VC1_MMAL, vc1_mmal); |
| 116 | 116 | REGISTER_HWACCEL(VC1_QSV, vc1_qsv); |
| 117 | 117 | REGISTER_HWACCEL(VP8_CUVID, vp8_cuvid); |
| 118 | + REGISTER_HWACCEL(VP8_MEDIACODEC, vp8_mediacodec); | |
| 118 | 119 | REGISTER_HWACCEL(VP9_CUVID, vp9_cuvid); |
| 119 | 120 | REGISTER_HWACCEL(VP9_D3D11VA, vp9_d3d11va); |
| 120 | 121 | REGISTER_HWACCEL(VP9_DXVA2, vp9_dxva2); |
| 122 | + REGISTER_HWACCEL(VP9_MEDIACODEC, vp9_mediacodec); | |
| 121 | 123 | REGISTER_HWACCEL(VP9_VAAPI, vp9_vaapi); |
| 122 | 124 | REGISTER_HWACCEL(WMV3_D3D11VA, wmv3_d3d11va); |
| 123 | 125 | REGISTER_HWACCEL(WMV3_DXVA2, wmv3_dxva2); |
| @@ -657,7 +659,9 @@ void avcodec_register_all(void) · 533 unmodified lines | ||
| 657 | 659 | REGISTER_DECODER(MPEG4_CUVID, mpeg4_cuvid); |
| 658 | 660 | REGISTER_DECODER(VC1_CUVID, vc1_cuvid); |
| 659 | 661 | REGISTER_DECODER(VP8_CUVID, vp8_cuvid); |
| 662 | + REGISTER_DECODER(VP8_MEDIACODEC, vp8_mediacodec); | |
| 660 | 663 | REGISTER_DECODER(VP9_CUVID, vp9_cuvid); |
| 664 | + REGISTER_DECODER(VP9_MEDIACODEC, vp9_mediacodec); | |
| 661 | 665 | |
| 662 | 666 | /* parsers */ |
| 663 | 667 | REGISTER_PARSER(AAC, aac); |
| @@ -766,3 +766,17 @@ AVHWAccel ff_hevc_mediacodec_hwaccel = { · 765 unmodified lines | ||
| 766 | 766 | .id = AV_CODEC_ID_HEVC, |
| 767 | 767 | .pix_fmt = AV_PIX_FMT_MEDIACODEC, |
| 768 | 768 | }; |
| 769 | + | |
| 770 | +AVHWAccel ff_vp8_mediacodec_hwaccel = { | |
| 771 | + .name = "mediacodec", | |
| 772 | + .type = AVMEDIA_TYPE_VIDEO, | |
| 773 | + .id = AV_CODEC_ID_VP8, | |
| 774 | + .pix_fmt = AV_PIX_FMT_MEDIACODEC, | |
| 775 | +}; | |
| 776 | + | |
| 777 | +AVHWAccel ff_vp9_mediacodec_hwaccel = { | |
| 778 | + .name = "mediacodec", | |
| 779 | + .type = AVMEDIA_TYPE_VIDEO, | |
| 780 | + .id = AV_CODEC_ID_VP9, | |
| 781 | + .pix_fmt = AV_PIX_FMT_MEDIACODEC, | |
| 782 | +}; | |
| @@ -1,5 +1,5 @@ | ||
| 1 | 1 | /* |
| 2 | − * Android MediaCodec H.264 / H.265 decoders | |
| 2 | + * Android MediaCodec H.264 / H.265 / VP8 / VP9 decoders | |
| 3 | 3 | * |
| 4 | 4 | * Copyright (c) 2015-2016 Matthieu Bouron <matthieu.bouron stupeflix.com> |
| 5 | 5 | * |
| @@ -65,6 +65,7 @@ static av_cold int mediacodec_decode_close(AVCodecContext *avctx) · 59 unmodified lines | ||
| 65 | 65 | return 0; |
| 66 | 66 | } |
| 67 | 67 | |
| 68 | +#if CONFIG_H264_MEDIACODEC_DECODER || CONFIG_HEVC_MEDIACODEC_DECODER | |
| 68 | 69 | static int h2645_ps_to_nalu(const uint8_t *src, int src_size, uint8_t **out, int *out_size) |
| 69 | 70 | { |
| 70 | 71 | int i; |
| @@ -116,6 +117,7 @@ done: · 45 unmodified lines | ||
| 116 | 117 | |
| 117 | 118 | return ret; |
| 118 | 119 | } |
| 120 | +#endif | |
| 119 | 121 | |
| 120 | 122 | #if CONFIG_H264_MEDIACODEC_DECODER |
| 121 | 123 | static int h264_set_extradata(AVCodecContext *avctx, FFAMediaFormat *format) |
| @@ -264,6 +266,19 @@ done: · 142 unmodified lines | ||
| 264 | 266 | } |
| 265 | 267 | #endif |
| 266 | 268 | |
| 269 | +#if CONFIG_VP8_MEDIACODEC_DECODER || CONFIG_VP9_MEDIACODEC_DECODER | |
| 270 | +static int vpx_set_extradata(AVCodecContext *avctx, FFAMediaFormat *format) | |
| 271 | +{ | |
| 272 | + int ret = 0; | |
| 273 | + | |
| 274 | + if (avctx->extradata) { | |
| 275 | + ff_AMediaFormat_setBuffer(format, "csd-0", avctx->extradata, avctx->extradata_size); | |
| 276 | + } | |
| 277 | + | |
| 278 | + return ret; | |
| 279 | +} | |
| 280 | +#endif | |
| 281 | + | |
| 267 | 282 | static av_cold int mediacodec_decode_init(AVCodecContext *avctx) |
| 268 | 283 | { |
| 269 | 284 | int ret; |
| @@ -303,6 +318,24 @@ static av_cold int mediacodec_decode_init(AVCodecContext *avctx) · 33 unmodified lines | ||
| 303 | 318 | if (ret < 0) |
| 304 | 319 | goto done; |
| 305 | 320 | break; |
| 321 | +#endif | |
| 322 | +#if CONFIG_VP8_MEDIACODEC_DECODER | |
| 323 | + case AV_CODEC_ID_VP8: | |
| 324 | + codec_mime = "video/x-vnd.on2.vp8"; | |
| 325 | + | |
| 326 | + ret = vpx_set_extradata(avctx, format); | |
| 327 | + if (ret < 0) | |
| 328 | + goto done; | |
| 329 | + break; | |
| 330 | +#endif | |
| 331 | +#if CONFIG_VP9_MEDIACODEC_DECODER | |
| 332 | + case AV_CODEC_ID_VP9: | |
| 333 | + codec_mime = "video/x-vnd.on2.vp9"; | |
| 334 | + | |
| 335 | + ret = vpx_set_extradata(avctx, format); | |
| 336 | + if (ret < 0) | |
| 337 | + goto done; | |
| 338 | + break; | |
| 306 | 339 | #endif |
| 307 | 340 | default: |
| 308 | 341 | av_assert0(0); |
| @@ -332,6 +365,7 @@ static av_cold int mediacodec_decode_init(AVCodecContext *avctx) · 23 unmodified lines | ||
| 332 | 365 | goto done; |
| 333 | 366 | } |
| 334 | 367 | |
| 368 | + if (bsf_name) { | |
| 335 | 369 | bsf = av_bsf_get_by_name(bsf_name); |
| 336 | 370 | if(!bsf) { |
| 337 | 371 | ret = AVERROR_BSF_NOT_FOUND; |
| @@ -346,6 +380,7 @@ static av_cold int mediacodec_decode_init(AVCodecContext *avctx) · 8 unmodified lines | ||
| 346 | 380 | ((ret = av_bsf_init(s->bsf)) < 0)) { |
| 347 | 381 | goto done; |
| 348 | 382 | } |
| 383 | + } | |
| 349 | 384 | |
| 350 | 385 | av_init_packet(&s->filtered_pkt); |
| 351 | 386 | |
| @@ -436,6 +471,7 @@ static int mediacodec_decode_frame(AVCodecContext *avctx, void *data, · 84 unmodified lines | ||
| 436 | 471 | |
| 437 | 472 | av_fifo_generic_read(s->fifo, &input_pkt, sizeof(input_pkt), NULL); |
| 438 | 473 | |
| 474 | + if (s->bsf) { | |
| 439 | 475 | ret = av_bsf_send_packet(s->bsf, &input_pkt); |
| 440 | 476 | if (ret < 0) { |
| 441 | 477 | return ret; |
| @@ -445,6 +481,9 @@ static int mediacodec_decode_frame(AVCodecContext *avctx, void *data, · 3 unmodified lines | ||
| 445 | 481 | if (ret == AVERROR(EAGAIN)) { |
| 446 | 482 | goto done; |
| 447 | 483 | } |
| 484 | + } else { | |
| 485 | + av_packet_move_ref(&s->filtered_pkt, &input_pkt); | |
| 486 | + } | |
| 448 | 487 | |
| 449 | 488 | /* {h264,hevc}_mp4toannexb are used here and do not require flushing */ |
| 450 | 489 | av_assert0(ret != AVERROR_EOF); |
| @@ -512,3 +551,35 @@ AVCodec ff_hevc_mediacodec_decoder = { · 61 unmodified lines | ||
| 512 | 551 | .caps_internal = FF_CODEC_CAP_SETS_PKT_DTS, |
| 513 | 552 | }; |
| 514 | 553 | #endif |
| 554 | + | |
| 555 | +#if CONFIG_VP8_MEDIACODEC_DECODER | |
| 556 | +AVCodec ff_vp8_mediacodec_decoder = { | |
| 557 | + .name = "vp8_mediacodec", | |
| 558 | + .long_name = NULL_IF_CONFIG_SMALL("VP8 Android MediaCodec decoder"), | |
| 559 | + .type = AVMEDIA_TYPE_VIDEO, | |
| 560 | + .id = AV_CODEC_ID_VP8, | |
| 561 | + .priv_data_size = sizeof(MediaCodecH264DecContext), | |
| 562 | + .init = mediacodec_decode_init, | |
| 563 | + .decode = mediacodec_decode_frame, | |
| 564 | + .flush = mediacodec_decode_flush, | |
| 565 | + .close = mediacodec_decode_close, | |
| 566 | + .capabilities = CODEC_CAP_DELAY, | |
| 567 | + .caps_internal = FF_CODEC_CAP_SETS_PKT_DTS, | |
| 568 | +}; | |
| 569 | +#endif | |
| 570 | + | |
| 571 | +#if CONFIG_VP9_MEDIACODEC_DECODER | |
| 572 | +AVCodec ff_vp9_mediacodec_decoder = { | |
| 573 | + .name = "vp9_mediacodec", | |
| 574 | + .long_name = NULL_IF_CONFIG_SMALL("VP9 Android MediaCodec decoder"), | |
| 575 | + .type = AVMEDIA_TYPE_VIDEO, | |
| 576 | + .id = AV_CODEC_ID_VP9, | |
| 577 | + .priv_data_size = sizeof(MediaCodecH264DecContext), | |
| 578 | + .init = mediacodec_decode_init, | |
| 579 | + .decode = mediacodec_decode_frame, | |
| 580 | + .flush = mediacodec_decode_flush, | |
| 581 | + .close = mediacodec_decode_close, | |
| 582 | + .capabilities = CODEC_CAP_DELAY, | |
| 583 | + .caps_internal = FF_CODEC_CAP_SETS_PKT_DTS, | |
| 584 | +}; | |
| 585 | +#endif | |
| @@ -28,7 +28,7 @@ · 27 unmodified lines | ||
| 28 | 28 | #include "libavutil/version.h" |
| 29 | 29 | |
| 30 | 30 | #define LIBAVCODEC_VERSION_MAJOR 57 |
| 31 | −#define LIBAVCODEC_VERSION_MINOR 61 | |
| 31 | +#define LIBAVCODEC_VERSION_MINOR 62 | |
| 32 | 32 | #define LIBAVCODEC_VERSION_MICRO 103 |
| 33 | 33 | |
| 34 | 34 | #define LIBAVCODEC_VERSION_INT AV_VERSION_INT(LIBAVCODEC_VERSION_MAJOR, \ |