1/* 2 * Copyright (C) 2009 Michael Niedermayer <michaelni@gmx.at> 3 * Copyright (c) 2009 Baptiste Coudurier <baptiste dot coudurier at gmail dot com> 4 * 5 * This file is part of FFmpeg. 6 * 7 * FFmpeg is free software; you can redistribute it and/or 8 * modify it under the terms of the GNU Lesser General Public 9 * License as published by the Free Software Foundation; either 10 * version 2.1 of the License, or (at your option) any later version. 11 * 12 * FFmpeg is distributed in the hope that it will be useful, 13 * but WITHOUT ANY WARRANTY; without even the implied warranty of 14 * MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the GNU 15 * Lesser General Public License for more details. 16 * 17 * You should have received a copy of the GNU Lesser General Public 18 * License along with FFmpeg; if not, write to the Free Software 19 * Foundation, Inc., 51 Franklin Street, Fifth Floor, Boston, MA 02110-1301 USA 20 */ 21 22#include "bytestream.h" 23#include "internal.h" 24 25static void RENAME(v210_enc)(AVCodecContext *avctx, 26 uint8_t *dst, const AVFrame *pic) 27{ 28 V210EncContext *s = avctx->priv_data; 29 int aligned_width = ((avctx->width + 47) / 48) * 48; 30 int stride = aligned_width * 8 / 3; 31 int line_padding = stride - ((avctx->width * 8 + 11) / 12) * 4; 32 int h, w; 33 const TYPE *y = (const TYPE *)pic->data[0]; 34 const TYPE *u = (const TYPE *)pic->data[1]; 35 const TYPE *v = (const TYPE *)pic->data[2]; 36 const int sample_size = 6 * s->RENAME(sample_factor); 37 const int sample_w = avctx->width / sample_size; 38 39 for (h = 0; h < avctx->height; h++) { 40 uint32_t val; 41 w = sample_w * sample_size; 42 s->RENAME(pack_line)(y, u, v, dst, w); 43 44 y += w; 45 u += w >> 1; 46 v += w >> 1; 47 dst += sample_w * 16 * s->RENAME(sample_factor); 48 49 for (; w < avctx->width - 5; w += 6) { 50 WRITE_PIXELS(u, y, v, DEPTH); 51 WRITE_PIXELS(y, u, y, DEPTH); 52 WRITE_PIXELS(v, y, u, DEPTH); 53 WRITE_PIXELS(y, v, y, DEPTH); 54 } 55 if (w < avctx->width - 1) { 56 WRITE_PIXELS(u, y, v, DEPTH); 57 58 val = CLIP(*y++, DEPTH) << (10-DEPTH); 59 if (w == avctx->width - 2) { 60 AV_WL32(dst, val); 61 dst += 4; 62 } 63 } 64 if (w < avctx->width - 3) { 65 val |= (CLIP(*u++, DEPTH) << (20-DEPTH)) | (CLIP(*y++, DEPTH) << (30-DEPTH)); 66 AV_WL32(dst, val); 67 dst += 4; 68 69 val = CLIP(*v++, DEPTH) << (10-DEPTH) | (CLIP(*y++, DEPTH) << (20-DEPTH)); 70 AV_WL32(dst, val); 71 dst += 4; 72 } 73 74 memset(dst, 0, line_padding); 75 dst += line_padding; 76 y += pic->linesize[0] / BYTES_PER_PIXEL - avctx->width; 77 u += pic->linesize[1] / BYTES_PER_PIXEL - avctx->width / 2; 78 v += pic->linesize[2] / BYTES_PER_PIXEL - avctx->width / 2; 79 } 80} 81