... | ... |
@@ -10,7 +10,7 @@ version <next>: |
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>: |
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" |
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 \ |
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) |
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) |
657 | 657 |
REGISTER_DECODER(MPEG4_CUVID, mpeg4_cuvid); |
658 | 658 |
REGISTER_DECODER(VC1_CUVID, vc1_cuvid); |
659 | 659 |
REGISTER_DECODER(VP8_CUVID, vp8_cuvid); |
660 |
+ REGISTER_DECODER(VP8_MEDIACODEC, vp8_mediacodec); |
|
660 | 661 |
REGISTER_DECODER(VP9_CUVID, vp9_cuvid); |
662 |
+ REGISTER_DECODER(VP9_MEDIACODEC, vp9_mediacodec); |
|
661 | 663 |
|
662 | 664 |
/* parsers */ |
663 | 665 |
REGISTER_PARSER(AAC, aac); |
... | ... |
@@ -766,3 +766,17 @@ AVHWAccel ff_hevc_mediacodec_hwaccel = { |
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) |
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: |
116 | 116 |
|
117 | 117 |
return ret; |
118 | 118 |
} |
119 |
+#endif |
|
119 | 120 |
|
120 | 121 |
#if CONFIG_H264_MEDIACODEC_DECODER |
121 | 122 |
static int h264_set_extradata(AVCodecContext *avctx, FFAMediaFormat *format) |
... | ... |
@@ -264,6 +266,19 @@ done: |
264 | 264 |
} |
265 | 265 |
#endif |
266 | 266 |
|
267 |
+#if CONFIG_VP8_MEDIACODEC_DECODER || CONFIG_VP9_MEDIACODEC_DECODER |
|
268 |
+static int vpx_set_extradata(AVCodecContext *avctx, FFAMediaFormat *format) |
|
269 |
+{ |
|
270 |
+ int ret = 0; |
|
271 |
+ |
|
272 |
+ if (avctx->extradata) { |
|
273 |
+ ff_AMediaFormat_setBuffer(format, "csd-0", avctx->extradata, avctx->extradata_size); |
|
274 |
+ } |
|
275 |
+ |
|
276 |
+ return ret; |
|
277 |
+} |
|
278 |
+#endif |
|
279 |
+ |
|
267 | 280 |
static av_cold int mediacodec_decode_init(AVCodecContext *avctx) |
268 | 281 |
{ |
269 | 282 |
int ret; |
... | ... |
@@ -304,6 +319,24 @@ static av_cold int mediacodec_decode_init(AVCodecContext *avctx) |
304 | 304 |
goto done; |
305 | 305 |
break; |
306 | 306 |
#endif |
307 |
+#if CONFIG_VP8_MEDIACODEC_DECODER |
|
308 |
+ case AV_CODEC_ID_VP8: |
|
309 |
+ codec_mime = "video/x-vnd.on2.vp8"; |
|
310 |
+ |
|
311 |
+ ret = vpx_set_extradata(avctx, format); |
|
312 |
+ if (ret < 0) |
|
313 |
+ goto done; |
|
314 |
+ break; |
|
315 |
+#endif |
|
316 |
+#if CONFIG_VP9_MEDIACODEC_DECODER |
|
317 |
+ case AV_CODEC_ID_VP9: |
|
318 |
+ codec_mime = "video/x-vnd.on2.vp9"; |
|
319 |
+ |
|
320 |
+ ret = vpx_set_extradata(avctx, format); |
|
321 |
+ if (ret < 0) |
|
322 |
+ goto done; |
|
323 |
+ break; |
|
324 |
+#endif |
|
307 | 325 |
default: |
308 | 326 |
av_assert0(0); |
309 | 327 |
} |
... | ... |
@@ -332,6 +365,7 @@ static av_cold int mediacodec_decode_init(AVCodecContext *avctx) |
332 | 332 |
goto done; |
333 | 333 |
} |
334 | 334 |
|
335 |
+ if (bsf_name) { |
|
335 | 336 |
bsf = av_bsf_get_by_name(bsf_name); |
336 | 337 |
if(!bsf) { |
337 | 338 |
ret = AVERROR_BSF_NOT_FOUND; |
... | ... |
@@ -346,6 +380,7 @@ static av_cold int mediacodec_decode_init(AVCodecContext *avctx) |
346 | 346 |
((ret = av_bsf_init(s->bsf)) < 0)) { |
347 | 347 |
goto done; |
348 | 348 |
} |
349 |
+ } |
|
349 | 350 |
|
350 | 351 |
av_init_packet(&s->filtered_pkt); |
351 | 352 |
|
... | ... |
@@ -436,6 +471,7 @@ static int mediacodec_decode_frame(AVCodecContext *avctx, void *data, |
436 | 436 |
|
437 | 437 |
av_fifo_generic_read(s->fifo, &input_pkt, sizeof(input_pkt), NULL); |
438 | 438 |
|
439 |
+ if (s->bsf) { |
|
439 | 440 |
ret = av_bsf_send_packet(s->bsf, &input_pkt); |
440 | 441 |
if (ret < 0) { |
441 | 442 |
return ret; |
... | ... |
@@ -445,6 +481,9 @@ static int mediacodec_decode_frame(AVCodecContext *avctx, void *data, |
445 | 445 |
if (ret == AVERROR(EAGAIN)) { |
446 | 446 |
goto done; |
447 | 447 |
} |
448 |
+ } else { |
|
449 |
+ av_packet_move_ref(&s->filtered_pkt, &input_pkt); |
|
450 |
+ } |
|
448 | 451 |
|
449 | 452 |
/* {h264,hevc}_mp4toannexb are used here and do not require flushing */ |
450 | 453 |
av_assert0(ret != AVERROR_EOF); |
... | ... |
@@ -512,3 +551,35 @@ AVCodec ff_hevc_mediacodec_decoder = { |
512 | 512 |
.caps_internal = FF_CODEC_CAP_SETS_PKT_DTS, |
513 | 513 |
}; |
514 | 514 |
#endif |
515 |
+ |
|
516 |
+#if CONFIG_VP8_MEDIACODEC_DECODER |
|
517 |
+AVCodec ff_vp8_mediacodec_decoder = { |
|
518 |
+ .name = "vp8_mediacodec", |
|
519 |
+ .long_name = NULL_IF_CONFIG_SMALL("VP8 Android MediaCodec decoder"), |
|
520 |
+ .type = AVMEDIA_TYPE_VIDEO, |
|
521 |
+ .id = AV_CODEC_ID_VP8, |
|
522 |
+ .priv_data_size = sizeof(MediaCodecH264DecContext), |
|
523 |
+ .init = mediacodec_decode_init, |
|
524 |
+ .decode = mediacodec_decode_frame, |
|
525 |
+ .flush = mediacodec_decode_flush, |
|
526 |
+ .close = mediacodec_decode_close, |
|
527 |
+ .capabilities = CODEC_CAP_DELAY, |
|
528 |
+ .caps_internal = FF_CODEC_CAP_SETS_PKT_DTS, |
|
529 |
+}; |
|
530 |
+#endif |
|
531 |
+ |
|
532 |
+#if CONFIG_VP9_MEDIACODEC_DECODER |
|
533 |
+AVCodec ff_vp9_mediacodec_decoder = { |
|
534 |
+ .name = "vp9_mediacodec", |
|
535 |
+ .long_name = NULL_IF_CONFIG_SMALL("VP9 Android MediaCodec decoder"), |
|
536 |
+ .type = AVMEDIA_TYPE_VIDEO, |
|
537 |
+ .id = AV_CODEC_ID_VP9, |
|
538 |
+ .priv_data_size = sizeof(MediaCodecH264DecContext), |
|
539 |
+ .init = mediacodec_decode_init, |
|
540 |
+ .decode = mediacodec_decode_frame, |
|
541 |
+ .flush = mediacodec_decode_flush, |
|
542 |
+ .close = mediacodec_decode_close, |
|
543 |
+ .capabilities = CODEC_CAP_DELAY, |
|
544 |
+ .caps_internal = FF_CODEC_CAP_SETS_PKT_DTS, |
|
545 |
+}; |
|
546 |
+#endif |
... | ... |
@@ -28,7 +28,7 @@ |
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, \ |