[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