[FFmpeg-devel] [PATCH 1/3] mpegvideo_parser: implement parsing of the picture structure field

Yusuke Nakamura muken.the.vfrmaniac at gmail.com
Sun Feb 11 22:37:32 EET 2018


2018-02-11 23:37 GMT+09:00 Jan Ekström <jeebjp at gmail.com>:

> From: Masaki Tanaka <maki.rxrz at gmail.com>
>
> Lets one receive the proper field order from pictures coded in
> field picture mode, until now forcibly set to BFF.
> ---
>  libavcodec/mpegvideo_parser.c | 16 +++++++++++++++-
>  1 file changed, 15 insertions(+), 1 deletion(-)
>
> diff --git a/libavcodec/mpegvideo_parser.c b/libavcodec/mpegvideo_parser.c
> index be240b6890..3406346a8b 100644
> --- a/libavcodec/mpegvideo_parser.c
> +++ b/libavcodec/mpegvideo_parser.c
> @@ -41,7 +41,7 @@ static void mpegvideo_extract_headers(AVCodecParserContext
> *s,
>      uint32_t start_code;
>      int frame_rate_index, ext_type, bytes_left;
>      int frame_rate_ext_n, frame_rate_ext_d;
> -    int top_field_first, repeat_first_field, progressive_frame;
> +    int picture_structure, top_field_first, repeat_first_field,
> progressive_frame;
>      int horiz_size_ext, vert_size_ext, bit_rate_ext;
>      int did_set_size=0;
>      int set_dim_ret = 0;
> @@ -51,6 +51,7 @@ static void mpegvideo_extract_headers(AVCodecParserContext
> *s,
>      enum AVPixelFormat pix_fmt = AV_PIX_FMT_NONE;
>  //FIXME replace the crap with get_bits()
>      s->repeat_pict = 0;
> +    s->picture_structure = AV_PICTURE_STRUCTURE_UNKNOWN;
>
>      while (buf < buf_end) {
>          start_code= -1;
> @@ -114,6 +115,7 @@ static void mpegvideo_extract_headers(AVCodecParserContext
> *s,
>                      break;
>                  case 0x8: /* picture coding extension */
>                      if (bytes_left >= 5) {
> +                        picture_structure = buf[2] & 0x03;
>                          top_field_first = buf[3] & (1 << 7);
>                          repeat_first_field = buf[3] & (1 << 1);
>                          progressive_frame = buf[4] & (1 << 7);
> @@ -138,6 +140,18 @@ static void mpegvideo_extract_headers(AVCodecParserContext
> *s,
>                                  s->field_order = AV_FIELD_BB;
>                          } else
>                              s->field_order = AV_FIELD_PROGRESSIVE;
> +
> +                        switch (picture_structure) {
> +                        case PICT_TOP_FIELD:
> +                            s->picture_structure =
> AV_PICTURE_STRUCTURE_TOP_FIELD;
> +                            break;
> +                        case PICT_BOTTOM_FIELD:
> +                            s->picture_structure =
> AV_PICTURE_STRUCTURE_BOTTOM_FIELD;
> +                            break;
> +                        case PICT_FRAME:
> +                            s->picture_structure =
> AV_PICTURE_STRUCTURE_FRAME;
> +                            break;
> +                        }
>

Libavcodec handles MPEG-2 Video packet per frame but not picture, and the
parser stops immediately after parsing the first slice of the picture. So,
the parser returns per full frame but picture_structure says it's a field
picture. This is evil and  this is the reason why I hesitate to post this
patch. I'm interested in how other devs consider this evil solution. I
think the parser should parse the second field too if encountering a field
coded picture, and treat the packet as frame coded and set field_order
appropriate.


>                      }
>                      break;
>                  }
> --
> 2.14.3
>
> _______________________________________________
> ffmpeg-devel mailing list
> ffmpeg-devel at ffmpeg.org
> http://ffmpeg.org/mailman/listinfo/ffmpeg-devel
>


More information about the ffmpeg-devel mailing list