1/* 2 * v308 encoder 3 * 4 * Copyright (c) 2011 Carl Eugen Hoyos 5 * 6 * This file is part of FFmpeg. 7 * 8 * FFmpeg is free software; you can redistribute it and/or 9 * modify it under the terms of the GNU Lesser General Public 10 * License as published by the Free Software Foundation; either 11 * version 2.1 of the License, or (at your option) any later version. 12 * 13 * FFmpeg is distributed in the hope that it will be useful, 14 * but WITHOUT ANY WARRANTY; without even the implied warranty of 15 * MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the GNU 16 * Lesser General Public License for more details. 17 * 18 * You should have received a copy of the GNU Lesser General Public 19 * License along with FFmpeg; if not, write to the Free Software 20 * Foundation, Inc., 51 Franklin Street, Fifth Floor, Boston, MA 02110-1301 USA 21 */ 22 23#include "libavutil/intreadwrite.h" 24#include "avcodec.h" 25#include "codec_internal.h" 26#include "encode.h" 27#include "internal.h" 28 29static av_cold int v308_encode_init(AVCodecContext *avctx) 30{ 31 if (avctx->width & 1) { 32 av_log(avctx, AV_LOG_ERROR, "v308 requires width to be even.\n"); 33 return AVERROR_INVALIDDATA; 34 } 35 36 avctx->bits_per_coded_sample = 24; 37 avctx->bit_rate = ff_guess_coded_bitrate(avctx); 38 39 return 0; 40} 41 42static int v308_encode_frame(AVCodecContext *avctx, AVPacket *pkt, 43 const AVFrame *pic, int *got_packet) 44{ 45 uint8_t *dst; 46 uint8_t *y, *u, *v; 47 int i, j, ret; 48 49 ret = ff_get_encode_buffer(avctx, pkt, avctx->width * avctx->height * 3, 0); 50 if (ret < 0) 51 return ret; 52 dst = pkt->data; 53 54 y = pic->data[0]; 55 u = pic->data[1]; 56 v = pic->data[2]; 57 58 for (i = 0; i < avctx->height; i++) { 59 for (j = 0; j < avctx->width; j++) { 60 *dst++ = v[j]; 61 *dst++ = y[j]; 62 *dst++ = u[j]; 63 } 64 y += pic->linesize[0]; 65 u += pic->linesize[1]; 66 v += pic->linesize[2]; 67 } 68 69 *got_packet = 1; 70 return 0; 71} 72 73const FFCodec ff_v308_encoder = { 74 .p.name = "v308", 75 .p.long_name = NULL_IF_CONFIG_SMALL("Uncompressed packed 4:4:4"), 76 .p.type = AVMEDIA_TYPE_VIDEO, 77 .p.id = AV_CODEC_ID_V308, 78 .p.capabilities = AV_CODEC_CAP_DR1, 79 .init = v308_encode_init, 80 FF_CODEC_ENCODE_CB(v308_encode_frame), 81 .p.pix_fmts = (const enum AVPixelFormat[]){ AV_PIX_FMT_YUV444P, AV_PIX_FMT_NONE }, 82 .caps_internal = FF_CODEC_CAP_INIT_THREADSAFE, 83}; 84