[vlc-devel] [PATCH] modules/codec/omxil/mediacodec.c: add MPEG2 support
Steve Lhomme
robux4 at ycbcr.xyz
Fri Feb 16 12:35:28 CET 2018
It seems your patch does 2 things. Can you split it in two ? Probably
the aspect ratio fix should come first if the MPEG2 decoder cannot work
without that.
Le 16/02/2018 à 11:04, Alexandre Janniaux a écrit :
> Add MPEG2 support with Mediacodec on Android, fixing the aspect ratio
> inside of the mediacodec_ndk submodule. It extracts the
> aspect_ratio_information from any block containing a SEQUENCE_HEADER
> and applies it in the UpdateVout function.
> ---
> modules/codec/omxil/mediacodec.c | 70 ++++++++++++++++++++++++++++++++--------
> 1 file changed, 57 insertions(+), 13 deletions(-)
>
> diff --git a/modules/codec/omxil/mediacodec.c b/modules/codec/omxil/mediacodec.c
> index cb6a72868c..57a3f532fd 100644
> --- a/modules/codec/omxil/mediacodec.c
> +++ b/modules/codec/omxil/mediacodec.c
> @@ -121,6 +121,7 @@ struct decoder_sys_t
> picture_sys_t** pp_inflight_pictures;
> unsigned int i_inflight_pictures;
> timestamp_fifo_t *timestamp_fifo;
> + int i_mpeg_dar_num, i_mpeg_dar_den;
> } video;
> struct {
> date_t i_end_date;
> @@ -143,6 +144,7 @@ static void CloseDecoder(vlc_object_t *);
>
> static int Video_OnNewBlock(decoder_t *, block_t **);
> static int VideoHXXX_OnNewBlock(decoder_t *, block_t **);
> +static int VideoMPEG2_OnNewBlock(decoder_t *, block_t **);
> static int VideoVC1_OnNewBlock(decoder_t *, block_t **);
> static void Video_OnFlush(decoder_t *);
> static int Video_ProcessOutput(decoder_t *, mc_api_out *, picture_t **,
> @@ -422,20 +424,33 @@ static int ParseExtra(decoder_t *p_dec)
> case VLC_CODEC_MP4V:
> if (!i_extra && p_sys->api.i_quirks & MC_API_VIDEO_QUIRKS_ADAPTIVE)
> p_sys->b_adaptive = true;
> - /* fall through */
> - default:
> - /* Set default CSD */
> - if (p_dec->fmt_in.i_extra)
> - return CSDDup(p_dec, p_dec->fmt_in.p_extra, p_dec->fmt_in.i_extra);
> - else
> - return VLC_SUCCESS;
> + break;
> + case VLC_CODEC_MPGV:
> + case VLC_CODEC_MP2V:
> + p_dec->p_sys->pf_on_new_block = VideoMPEG2_OnNewBlock;
> + break;
> }
> + /* Set default CSD */
> + if (p_dec->fmt_in.i_extra)
> + return CSDDup(p_dec, p_dec->fmt_in.p_extra, p_dec->fmt_in.i_extra);
> + else
> + return VLC_SUCCESS;
> }
>
> static int UpdateVout(decoder_t *p_dec)
> {
> decoder_sys_t *p_sys = p_dec->p_sys;
>
> + if ((p_dec->fmt_in.i_codec == VLC_CODEC_MPGV ||
> + p_dec->fmt_in.i_codec == VLC_CODEC_MP2V) &&
> + p_sys->video.i_mpeg_dar_num * p_sys->video.i_mpeg_dar_den != 0)
> + {
> + p_dec->fmt_out.video.i_sar_num =
> + p_sys->video.i_mpeg_dar_num * p_dec->fmt_out.video.i_height;
> + p_dec->fmt_out.video.i_sar_den =
> + p_sys->video.i_mpeg_dar_den * p_dec->fmt_out.video.i_width;
> + }
> +
> /* If MediaCodec can handle the rotation, reset the orientation to
> * Normal in order to ask the vout not to rotate. */
> if (p_sys->video.i_angle != 0)
> @@ -563,16 +578,14 @@ static int OpenDecoder(vlc_object_t *p_this, pf_MediaCodecApi_init pf_init)
> break;
> case VLC_CODEC_H263: mime = "video/3gpp"; break;
> case VLC_CODEC_MP4V: mime = "video/mp4v-es"; break;
> + case VLC_CODEC_MPGV:
> + case VLC_CODEC_MP2V:
> + mime = "video/mpeg2";
> + break;
> case VLC_CODEC_WMV3: mime = "video/x-ms-wmv"; break;
> case VLC_CODEC_VC1: mime = "video/wvc1"; break;
> case VLC_CODEC_VP8: mime = "video/x-vnd.on2.vp8"; break;
> case VLC_CODEC_VP9: mime = "video/x-vnd.on2.vp9"; break;
> - /* FIXME: mpeg2 is disabled: sar num/den can't be updated from
> - * MediaCodec. Use avcodec instead that will update it. The proper
> - * solution is to update sar from a mpeg2 packetizer.
> - *
> - * case VLC_CODEC_MPGV: mime = "video/mpeg2"; break;
> - */
> }
> }
> else
> @@ -614,6 +627,8 @@ static int OpenDecoder(vlc_object_t *p_this, pf_MediaCodecApi_init pf_init)
> p_sys->api.i_codec = p_dec->fmt_in.i_codec;
> p_sys->api.i_cat = p_dec->fmt_in.i_cat;
> p_sys->api.psz_mime = mime;
> + p_sys->video.i_mpeg_dar_num = 0;
> + p_sys->video.i_mpeg_dar_den = 0;
>
> if (pf_init(&p_sys->api) != 0)
> {
> @@ -1582,6 +1597,35 @@ static int VideoHXXX_OnNewBlock(decoder_t *p_dec, block_t **pp_block)
> return Video_OnNewBlock(p_dec, pp_block);
> }
>
> +static int VideoMPEG2_OnNewBlock(decoder_t *p_dec, block_t **pp_block)
> +{
> + if (pp_block == NULL || (*pp_block)->i_buffer <= 7)
> + return Video_OnNewBlock(p_dec, pp_block);
> +
> + decoder_sys_t *p_sys = p_dec->p_sys;
> + const int startcode = (*pp_block)->p_buffer[3];
> +
> + static const int mpeg2_aspect[16][2] =
> + {
> + {0,0}, {1,1}, {4,3}, {16,9}, {221,100},
> + {0,0}, {0,0}, {0,0}, {0,0}, {0,0}, {0,0}, {0,0}, {0,0}, {0,0},
> + {0,0}, {0,0}
> + };
> +
> + if (startcode == 0xB3 /* SEQUENCE_HEADER_STARTCODE */)
> + {
> + int mpeg_dar_code = (*pp_block)->p_buffer[7] >> 4;
> +
> + if (mpeg_dar_code >= 16)
> + return Video_OnNewBlock(p_dec, pp_block);
> +
> + p_sys->video.i_mpeg_dar_num = mpeg2_aspect[mpeg_dar_code][0];
> + p_sys->video.i_mpeg_dar_den = mpeg2_aspect[mpeg_dar_code][1];
> + }
> +
> + return Video_OnNewBlock(p_dec, pp_block);
> +}
> +
> static int VideoVC1_OnNewBlock(decoder_t *p_dec, block_t **pp_block)
> {
> block_t *p_block = *pp_block;
More information about the vlc-devel
mailing list