Subversion Repositories Kolibri OS

Rev

Blame | Last modification | View Log | RSS feed

  1. /*
  2.  * R210 encoder
  3.  *
  4.  * Copyright (c) 2012 Paul B Mahol
  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 "avcodec.h"
  24. #include "internal.h"
  25. #include "bytestream.h"
  26.  
  27. static av_cold int encode_init(AVCodecContext *avctx)
  28. {
  29.     avctx->coded_frame = avcodec_alloc_frame();
  30.  
  31.     if (!avctx->coded_frame)
  32.         return AVERROR(ENOMEM);
  33.  
  34.     return 0;
  35. }
  36.  
  37. static int encode_frame(AVCodecContext *avctx, AVPacket *pkt,
  38.                         const AVFrame *pic, int *got_packet)
  39. {
  40.     int i, j, ret;
  41.     int aligned_width = FFALIGN(avctx->width,
  42.                                 avctx->codec_id == AV_CODEC_ID_R10K ? 1 : 64);
  43.     int pad = (aligned_width - avctx->width) * 4;
  44.     uint8_t *src_line;
  45.     uint8_t *dst;
  46.  
  47.     if ((ret = ff_alloc_packet2(avctx, pkt, 4 * aligned_width * avctx->height)) < 0)
  48.         return ret;
  49.  
  50.     avctx->coded_frame->key_frame = 1;
  51.     avctx->coded_frame->pict_type = AV_PICTURE_TYPE_I;
  52.     src_line = pic->data[0];
  53.     dst = pkt->data;
  54.  
  55.     for (i = 0; i < avctx->height; i++) {
  56.         uint16_t *src = (uint16_t *)src_line;
  57.         for (j = 0; j < avctx->width; j++) {
  58.             uint32_t pixel;
  59.             uint16_t r = *src++ >> 6;
  60.             uint16_t g = *src++ >> 6;
  61.             uint16_t b = *src++ >> 4;
  62.             if (avctx->codec_id == AV_CODEC_ID_R210)
  63.                 pixel = (r << 20) | (g << 10) | b >> 2;
  64.             else
  65.                 pixel = (r << 22) | (g << 12) | b;
  66.             if (avctx->codec_id == AV_CODEC_ID_AVRP)
  67.                 bytestream_put_le32(&dst, pixel);
  68.             else
  69.                 bytestream_put_be32(&dst, pixel);
  70.         }
  71.         memset(dst, 0, pad);
  72.         dst += pad;
  73.         src_line += pic->linesize[0];
  74.     }
  75.  
  76.     pkt->flags |= AV_PKT_FLAG_KEY;
  77.     *got_packet = 1;
  78.     return 0;
  79. }
  80.  
  81. static av_cold int encode_close(AVCodecContext *avctx)
  82. {
  83.     av_freep(&avctx->coded_frame);
  84.  
  85.     return 0;
  86. }
  87.  
  88. #if CONFIG_R210_ENCODER
  89. AVCodec ff_r210_encoder = {
  90.     .name           = "r210",
  91.     .long_name      = NULL_IF_CONFIG_SMALL("Uncompressed RGB 10-bit"),
  92.     .type           = AVMEDIA_TYPE_VIDEO,
  93.     .id             = AV_CODEC_ID_R210,
  94.     .init           = encode_init,
  95.     .encode2        = encode_frame,
  96.     .close          = encode_close,
  97.     .pix_fmts       = (const enum AVPixelFormat[]) { AV_PIX_FMT_RGB48, AV_PIX_FMT_NONE },
  98. };
  99. #endif
  100. #if CONFIG_R10K_ENCODER
  101. AVCodec ff_r10k_encoder = {
  102.     .name           = "r10k",
  103.     .long_name      = NULL_IF_CONFIG_SMALL("AJA Kona 10-bit RGB Codec"),
  104.     .type           = AVMEDIA_TYPE_VIDEO,
  105.     .id             = AV_CODEC_ID_R10K,
  106.     .init           = encode_init,
  107.     .encode2        = encode_frame,
  108.     .close          = encode_close,
  109.     .pix_fmts       = (const enum AVPixelFormat[]) { AV_PIX_FMT_RGB48, AV_PIX_FMT_NONE },
  110. };
  111. #endif
  112. #if CONFIG_AVRP_ENCODER
  113. AVCodec ff_avrp_encoder = {
  114.     .name           = "avrp",
  115.     .long_name      = NULL_IF_CONFIG_SMALL("Avid 1:1 10-bit RGB Packer"),
  116.     .type           = AVMEDIA_TYPE_VIDEO,
  117.     .id             = AV_CODEC_ID_AVRP,
  118.     .init           = encode_init,
  119.     .encode2        = encode_frame,
  120.     .close          = encode_close,
  121.     .pix_fmts       = (const enum AVPixelFormat[]) { AV_PIX_FMT_RGB48, AV_PIX_FMT_NONE },
  122. };
  123. #endif
  124.