[FFmpeg-devel] [PATCH][libavcodec] Duckduckgo Truemotion 1 - some code cleanup and preparation for addition of sprite support

ffmpegandmahanstreamer at lolcow.email ffmpegandmahanstreamer at lolcow.email
Wed Jul 14 15:04:09 EEST 2021


On 2021-07-04 17:58, ffmpegandmahanstreamer at lolcow.email wrote:
> These are some cosmetic changes and also priming the decoder for
> sprite support (which i plan on adding). This patch was mainly for me
> to get used to the git email patch flow, if anything. Of course the
> decoder still works as it was before (i tested it).
> ---
>  libavcodec/truemotion1.c | 41 +++++++++++++++++-----------------------
>  1 file changed, 17 insertions(+), 24 deletions(-)
> 
> diff --git a/libavcodec/truemotion1.c b/libavcodec/truemotion1.c
> index 32d8fb4005..80946a405f 100644
> --- a/libavcodec/truemotion1.c
> +++ b/libavcodec/truemotion1.c
> @@ -23,10 +23,10 @@
>   * @file
>   * Duck TrueMotion v1 Video Decoder by
>   * Alex Beregszaszi and
> - * Mike Melanson (melanson at pcisys.net)
> + * Mike Melanson (mike at multimedia.cx)
>   *
>   * The TrueMotion v1 decoder presently only decodes 16-bit TM1 data 
> and
> - * outputs RGB555 (or RGB565) data. 24-bit TM1 data is not supported 
> yet.
> + * outputs RGB555 (or RGB565) data.
>   */
> 
>  #include <stdio.h>
> @@ -360,8 +360,12 @@ static int 
> truemotion1_decode_header(TrueMotion1Context *s)
>          s->flags = FLAG_KEYFRAME;
> 
>      if (s->flags & FLAG_SPRITE) {
> +        // https://wiki.multimedia.cx/index.php/Duck_TrueMotion_1
> +        header.xoffset = AV_RL16(&header_buffer[13]);
> +        header.yoffset = AV_RL16(&header_buffer[15]);
> +        header.width = AV_RL16(&header_buffer[17]);
> +        header.height = AV_RL16(&header_buffer[19]);
>          avpriv_request_sample(s->avctx, "Frame with sprite");
> -        /* FIXME header.width, height, xoffset and yoffset aren't
> initialized */
>          return AVERROR_PATCHWELCOME;
>      } else {
>          s->w = header.xsize;
> @@ -660,20 +664,15 @@ static void
> truemotion1_decode_16bit(TrueMotion1Context *s)
>                  case 0:
>                      /* if macroblock width is 2, apply C-Y-C-Y; else
>                       * apply C-Y-Y */
> +                    APPLY_C_PREDICTOR();
> +                    APPLY_Y_PREDICTOR();
> +                    OUTPUT_PIXEL_PAIR();
>                      if (s->block_width == 2) {
>                          APPLY_C_PREDICTOR();
> -                        APPLY_Y_PREDICTOR();
> -                        OUTPUT_PIXEL_PAIR();
> -                        APPLY_C_PREDICTOR();
> -                        APPLY_Y_PREDICTOR();
> -                        OUTPUT_PIXEL_PAIR();
> -                    } else {
> -                        APPLY_C_PREDICTOR();
> -                        APPLY_Y_PREDICTOR();
> -                        OUTPUT_PIXEL_PAIR();
> -                        APPLY_Y_PREDICTOR();
>                          OUTPUT_PIXEL_PAIR();
>                      }
> +                    APPLY_Y_PREDICTOR();
> +                    OUTPUT_PIXEL_PAIR();
>                      break;
> 
>                  case 1:
> @@ -786,20 +785,14 @@ static void
> truemotion1_decode_24bit(TrueMotion1Context *s)
>                  case 0:
>                      /* if macroblock width is 2, apply C-Y-C-Y; else
>                       * apply C-Y-Y */
> +                    APPLY_C_PREDICTOR_24();
> +                    APPLY_Y_PREDICTOR_24();
> +                    OUTPUT_PIXEL_PAIR();
>                      if (s->block_width == 2) {
>                          APPLY_C_PREDICTOR_24();
> -                        APPLY_Y_PREDICTOR_24();
> -                        OUTPUT_PIXEL_PAIR();
> -                        APPLY_C_PREDICTOR_24();
> -                        APPLY_Y_PREDICTOR_24();
> -                        OUTPUT_PIXEL_PAIR();
> -                    } else {
> -                        APPLY_C_PREDICTOR_24();
> -                        APPLY_Y_PREDICTOR_24();
> -                        OUTPUT_PIXEL_PAIR();
> -                        APPLY_Y_PREDICTOR_24();
> -                        OUTPUT_PIXEL_PAIR();
>                      }
> +                    APPLY_Y_PREDICTOR_24();
> +                    OUTPUT_PIXEL_PAIR();
>                      break;
> 
>                  case 1:
ping


More information about the ffmpeg-devel mailing list