Hi, On 19 October 2014 14:52:17 CEST, Michael Niedermayer <michae...@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 <michae...@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 _______________________________________________ ffmpeg-devel mailing list ffmpeg-devel@ffmpeg.org http://ffmpeg.org/mailman/listinfo/ffmpeg-devel