[FFmpeg-devel] [PATCH 2/2] avcodec/libutvideodec: Support YUV422P10

Benoit Fouet benoit.fouet at free.fr
Sun Oct 19 20:35:08 CEST 2014


Hi,

On 19 October 2014 14:52:17 CEST, Michael Niedermayer <michaelni at gmx.at> wrote:
>Based on ConvertToPlanar() from libutvideo
>libutvideo sadly does not seem to support exporting its internal planar
>buffers
>
>Signed-off-by: Michael Niedermayer <michaelni at gmx.at>
>---
>libavcodec/libutvideodec.cpp |   55
>+++++++++++++++++++++++++++++++++++++++++-
> 1 file changed, 54 insertions(+), 1 deletion(-)
>
>diff --git a/libavcodec/libutvideodec.cpp
>b/libavcodec/libutvideodec.cpp
>index 36dc952..f76a53a 100644
>--- a/libavcodec/libutvideodec.cpp
>+++ b/libavcodec/libutvideodec.cpp

[...]

>@@ -88,6 +94,8 @@ static av_cold int utvideo_decode_init(AVCodecContext
>*avctx)
> 
>     /* Only allocate the buffer once */
>utv->buf_size = avpicture_get_size(avctx->pix_fmt, avctx->width,
>avctx->height);
>+    if (format == UTVF_v210)
>+        utv->buf_size += avctx->height * ((avctx->width + 47) / 48) *
>128;

A comment on the rounding would be cool.

>   utv->buffer = (uint8_t *)av_malloc(utv->buf_size * sizeof(uint8_t));
> 
>     if (utv->buffer == NULL) {
>@@ -155,6 +163,51 @@ static int utvideo_decode_frame(AVCodecContext
>*avctx, void *data,
>         pic->linesize[0] = w * 2;
>         pic->data[0] = utv->buffer;
>         break;
>+    case AV_PIX_FMT_YUV422P10: {
>+        uint16_t *y, *u, *v;
>+        int i,j;
>+        int linesize = ((w + 47) / 48) * 128;
>+
>+        pic->linesize[0] = w * 2;
>+        pic->linesize[1] =
>+        pic->linesize[2] = w;
>+        pic->data[0] = utv->buffer + linesize * h;
>+        pic->data[1] = pic->data[0] + h*pic->linesize[0];
>+        pic->data[2] = pic->data[1] + h*pic->linesize[1];
>+        y = (uint16_t*)pic->data[0];
>+        u = (uint16_t*)pic->data[1];
>+        v = (uint16_t*)pic->data[2];
>+        for (j = 0; j < h; j++) {
>+            const uint8_t *in = utv->buffer + j * linesize;
>+
>+            for (i = 0; i + 1 < w; i += 6, in += 4) {
>+                *u++ = (AV_RL32(in+0)    ) & 0x3FF;
>+                *y++ = (AV_RL32(in+0)>>10) & 0x3FF;
>+                *v++ = (AV_RL32(in+0)>>20) & 0x3FF;

Couldn't this be using a temp variable for AV_RL32 (here and below)?

>+                *y++ = (AV_RL32(in+4)    ) & 0x3FF;
>+                in += 4;
>+
>+                if (i + 3 >= w)
>+                    break;
>+
>+                *u++ = (AV_RL32(in+0)>>10) & 0x3FF;
>+                *y++ = (AV_RL32(in+0)>>20) & 0x3FF;
>+                *v++ = (AV_RL32(in+4)    ) & 0x3FF;
>+                *y++ = (AV_RL32(in+4)>>10) & 0x3FF;
>+                in += 4;
>+
>+                if (i + 5 >= w)
>+                    break;
>+
>+                *u++ = (AV_RL32(in+0)>>20) & 0x3FF;
>+                *y++ = (AV_RL32(in+4)    ) & 0x3FF;
>+                *v++ = (AV_RL32(in+4)>>10) & 0x3FF;
>+                *y++ = (AV_RL32(in+4)>>20) & 0x3FF;
>+                in += 4;
>+            }
>+        }
>+        break;
>+    }
>     case AV_PIX_FMT_BGR24:
>     case AV_PIX_FMT_RGB32:
>    /* Make the linesize negative, since Ut Video uses bottom-up BGR */

-- 
Ben


More information about the ffmpeg-devel mailing list