Android TV and FireOS hardware supports mpeg2 hardware decoding via
MediaCodec.
Signed-off-by: Matthieu Bouron <matthieu.bouron@gmail.com>
... | ... |
@@ -2656,6 +2656,7 @@ mpeg2_d3d11va_hwaccel_deps="d3d11va" |
2656 | 2656 |
mpeg2_d3d11va_hwaccel_select="mpeg2video_decoder" |
2657 | 2657 |
mpeg2_dxva2_hwaccel_deps="dxva2" |
2658 | 2658 |
mpeg2_dxva2_hwaccel_select="mpeg2video_decoder" |
2659 |
+mpeg2_mediacodec_hwaccel_deps="mediacodec" |
|
2659 | 2660 |
mpeg2_mmal_hwaccel_deps="mmal" |
2660 | 2661 |
mpeg2_qsv_hwaccel_deps="libmfx" |
2661 | 2662 |
mpeg2_qsv_hwaccel_select="qsvdec_mpeg2" |
... | ... |
@@ -2762,6 +2763,7 @@ mpeg1_vdpau_decoder_select="mpeg1video_decoder" |
2762 | 2762 |
mpeg2_crystalhd_decoder_select="crystalhd" |
2763 | 2763 |
mpeg2_cuvid_decoder_deps="cuda cuvid" |
2764 | 2764 |
mpeg2_mmal_decoder_deps="mmal" |
2765 |
+mpeg2_mediacodec_decoder_deps="mediacodec" |
|
2765 | 2766 |
mpeg2_qsv_decoder_deps="libmfx" |
2766 | 2767 |
mpeg2_qsv_decoder_select="qsvdec mpeg2_qsv_hwaccel" |
2767 | 2768 |
mpeg2_qsv_encoder_deps="libmfx" |
... | ... |
@@ -423,6 +423,7 @@ OBJS-$(CONFIG_MPEG2_QSV_DECODER) += qsvdec_other.o |
423 | 423 |
OBJS-$(CONFIG_MPEG2_QSV_ENCODER) += qsvenc_mpeg2.o |
424 | 424 |
OBJS-$(CONFIG_MPEG2VIDEO_DECODER) += mpeg12dec.o mpeg12.o mpeg12data.o |
425 | 425 |
OBJS-$(CONFIG_MPEG2VIDEO_ENCODER) += mpeg12enc.o mpeg12.o |
426 |
+OBJS-$(CONFIG_MPEG2_MEDIACODEC_DECODER) += mediacodecdec.o |
|
426 | 427 |
OBJS-$(CONFIG_MPEG2_VAAPI_ENCODER) += vaapi_encode_mpeg2.o |
427 | 428 |
OBJS-$(CONFIG_MPEG4_DECODER) += xvididct.o |
428 | 429 |
OBJS-$(CONFIG_MPEG4_MEDIACODEC_DECODER) += mediacodecdec.o |
... | ... |
@@ -96,6 +96,7 @@ static void register_all(void) |
96 | 96 |
REGISTER_HWACCEL(MPEG2_VAAPI, mpeg2_vaapi); |
97 | 97 |
REGISTER_HWACCEL(MPEG2_VDPAU, mpeg2_vdpau); |
98 | 98 |
REGISTER_HWACCEL(MPEG2_VIDEOTOOLBOX, mpeg2_videotoolbox); |
99 |
+ REGISTER_HWACCEL(MPEG2_MEDIACODEC, mpeg2_mediacodec); |
|
99 | 100 |
REGISTER_HWACCEL(MPEG4_CUVID, mpeg4_cuvid); |
100 | 101 |
REGISTER_HWACCEL(MPEG4_MEDIACODEC, mpeg4_mediacodec); |
101 | 102 |
REGISTER_HWACCEL(MPEG4_MMAL, mpeg4_mmal); |
... | ... |
@@ -257,6 +258,7 @@ static void register_all(void) |
257 | 257 |
REGISTER_DECODER(MPEG2_MMAL, mpeg2_mmal); |
258 | 258 |
REGISTER_DECODER(MPEG2_CRYSTALHD, mpeg2_crystalhd); |
259 | 259 |
REGISTER_DECODER(MPEG2_QSV, mpeg2_qsv); |
260 |
+ REGISTER_DECODER(MPEG2_MEDIACODEC, mpeg2_mediacodec); |
|
260 | 261 |
REGISTER_DECODER(MSA1, msa1); |
261 | 262 |
REGISTER_DECODER(MSCC, mscc); |
262 | 263 |
REGISTER_DECODER(MSMPEG4V1, msmpeg4v1); |
... | ... |
@@ -1,5 +1,5 @@ |
1 | 1 |
/* |
2 |
- * Android MediaCodec H.264 / H.265 / MPEG-4 / VP8 / VP9 decoders |
|
2 |
+ * Android MediaCodec MPEG-2 / H.264 / H.265 / MPEG-4 / VP8 / VP9 decoders |
|
3 | 3 |
* |
4 | 4 |
* Copyright (c) 2015-2016 Matthieu Bouron <matthieu.bouron stupeflix.com> |
5 | 5 |
* |
... | ... |
@@ -267,6 +267,19 @@ done: |
267 | 267 |
} |
268 | 268 |
#endif |
269 | 269 |
|
270 |
+#if CONFIG_MPEG2_MEDIACODEC_DECODER |
|
271 |
+static int mpeg2_set_extradata(AVCodecContext *avctx, FFAMediaFormat *format) |
|
272 |
+{ |
|
273 |
+ int ret = 0; |
|
274 |
+ |
|
275 |
+ if (avctx->extradata) { |
|
276 |
+ ff_AMediaFormat_setBuffer(format, "csd-0", avctx->extradata, avctx->extradata_size); |
|
277 |
+ } |
|
278 |
+ |
|
279 |
+ return ret; |
|
280 |
+} |
|
281 |
+#endif |
|
282 |
+ |
|
270 | 283 |
#if CONFIG_MPEG4_MEDIACODEC_DECODER |
271 | 284 |
static int mpeg4_set_extradata(AVCodecContext *avctx, FFAMediaFormat *format) |
272 | 285 |
{ |
... | ... |
@@ -333,6 +346,15 @@ static av_cold int mediacodec_decode_init(AVCodecContext *avctx) |
333 | 333 |
goto done; |
334 | 334 |
break; |
335 | 335 |
#endif |
336 |
+#if CONFIG_MPEG2_MEDIACODEC_DECODER |
|
337 |
+ case AV_CODEC_ID_MPEG2VIDEO: |
|
338 |
+ codec_mime = "video/mpeg2"; |
|
339 |
+ |
|
340 |
+ ret = mpeg2_set_extradata(avctx, format); |
|
341 |
+ if (ret < 0) |
|
342 |
+ goto done; |
|
343 |
+ break; |
|
344 |
+#endif |
|
336 | 345 |
#if CONFIG_MPEG4_MEDIACODEC_DECODER |
337 | 346 |
case AV_CODEC_ID_MPEG4: |
338 | 347 |
codec_mime = "video/mp4v-es", |
... | ... |
@@ -575,6 +597,22 @@ AVCodec ff_hevc_mediacodec_decoder = { |
575 | 575 |
}; |
576 | 576 |
#endif |
577 | 577 |
|
578 |
+#if CONFIG_MPEG2_MEDIACODEC_DECODER |
|
579 |
+AVCodec ff_mpeg2_mediacodec_decoder = { |
|
580 |
+ .name = "mpeg2_mediacodec", |
|
581 |
+ .long_name = NULL_IF_CONFIG_SMALL("MPEG-2 Android MediaCodec decoder"), |
|
582 |
+ .type = AVMEDIA_TYPE_VIDEO, |
|
583 |
+ .id = AV_CODEC_ID_MPEG2VIDEO, |
|
584 |
+ .priv_data_size = sizeof(MediaCodecH264DecContext), |
|
585 |
+ .init = mediacodec_decode_init, |
|
586 |
+ .decode = mediacodec_decode_frame, |
|
587 |
+ .flush = mediacodec_decode_flush, |
|
588 |
+ .close = mediacodec_decode_close, |
|
589 |
+ .capabilities = AV_CODEC_CAP_DELAY | AV_CODEC_CAP_AVOID_PROBING, |
|
590 |
+ .caps_internal = FF_CODEC_CAP_SETS_PKT_DTS, |
|
591 |
+}; |
|
592 |
+#endif |
|
593 |
+ |
|
578 | 594 |
#if CONFIG_MPEG4_MEDIACODEC_DECODER |
579 | 595 |
AVCodec ff_mpeg4_mediacodec_decoder = { |
580 | 596 |
.name = "mpeg4_mediacodec", |
... | ... |
@@ -766,6 +766,13 @@ AVHWAccel ff_hevc_mediacodec_hwaccel = { |
766 | 766 |
.pix_fmt = AV_PIX_FMT_MEDIACODEC, |
767 | 767 |
}; |
768 | 768 |
|
769 |
+AVHWAccel ff_mpeg2_mediacodec_hwaccel = { |
|
770 |
+ .name = "mediacodec", |
|
771 |
+ .type = AVMEDIA_TYPE_VIDEO, |
|
772 |
+ .id = AV_CODEC_ID_MPEG2VIDEO, |
|
773 |
+ .pix_fmt = AV_PIX_FMT_MEDIACODEC, |
|
774 |
+}; |
|
775 |
+ |
|
769 | 776 |
AVHWAccel ff_mpeg4_mediacodec_hwaccel = { |
770 | 777 |
.name = "mediacodec", |
771 | 778 |
.type = AVMEDIA_TYPE_VIDEO, |