Subversion Repositories Kolibri OS

Rev

Blame | Last modification | View Log | RSS feed

  1. /*
  2.  * AVID Meridien encoder
  3.  *
  4.  * Copyright (c) 2012 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 "avcodec.h"
  24. #include "internal.h"
  25. #include "libavutil/intreadwrite.h"
  26.  
  27. static av_cold int avui_encode_init(AVCodecContext *avctx)
  28. {
  29.     if (avctx->width != 720 || avctx->height != 486 && avctx->height != 576) {
  30.         av_log(avctx, AV_LOG_ERROR, "Only 720x486 and 720x576 are supported.\n");
  31.         return AVERROR(EINVAL);
  32.     }
  33.     if (!(avctx->extradata = av_mallocz(144 + AV_INPUT_BUFFER_PADDING_SIZE)))
  34.         return AVERROR(ENOMEM);
  35.     avctx->extradata_size = 144;
  36.     memcpy(avctx->extradata, "\0\0\0\x18""APRGAPRG0001", 16);
  37.     if (avctx->field_order > AV_FIELD_PROGRESSIVE) {
  38.         avctx->extradata[19] = 2;
  39.     } else {
  40.         avctx->extradata[19] = 1;
  41.     }
  42.     memcpy(avctx->extradata + 24, "\0\0\0\x78""ARESARES0001""\0\0\0\x98", 20);
  43.     AV_WB32(avctx->extradata + 44, avctx->width);
  44.     AV_WB32(avctx->extradata + 48, avctx->height);
  45.     memcpy(avctx->extradata + 52, "\0\0\0\x1\0\0\0\x20\0\0\0\x2", 12);
  46.  
  47.  
  48.     return 0;
  49. }
  50.  
  51. static int avui_encode_frame(AVCodecContext *avctx, AVPacket *pkt,
  52.                              const AVFrame *pic, int *got_packet)
  53. {
  54.     uint8_t *dst;
  55.     int i, j, skip, ret, size, interlaced;
  56.  
  57.     interlaced = avctx->field_order > AV_FIELD_PROGRESSIVE;
  58.  
  59.     if (avctx->height == 486) {
  60.         skip = 10;
  61.     } else {
  62.         skip = 16;
  63.     }
  64.     size = 2 * avctx->width * (avctx->height + skip) + 8 * interlaced;
  65.     if ((ret = ff_alloc_packet2(avctx, pkt, size, size)) < 0)
  66.         return ret;
  67.     dst = pkt->data;
  68.     if (!interlaced) {
  69.         memset(dst, 0, avctx->width * skip);
  70.         dst += avctx->width * skip;
  71.     }
  72.  
  73.     for (i = 0; i <= interlaced; i++) {
  74.         uint8_t *src;
  75.         if (interlaced && avctx->height == 486) {
  76.             src = pic->data[0] + (1 - i) * pic->linesize[0];
  77.         } else {
  78.             src = pic->data[0] + i * pic->linesize[0];
  79.         }
  80.         memset(dst, 0, avctx->width * skip + 4 * i);
  81.         dst += avctx->width * skip + 4 * i;
  82.         for (j = 0; j < avctx->height; j += interlaced + 1) {
  83.             memcpy(dst, src, avctx->width * 2);
  84.             src += (interlaced + 1) * pic->linesize[0];
  85.             dst += avctx->width * 2;
  86.         }
  87.     }
  88.  
  89.     pkt->flags |= AV_PKT_FLAG_KEY;
  90.     *got_packet = 1;
  91.     return 0;
  92. }
  93.  
  94. AVCodec ff_avui_encoder = {
  95.     .name         = "avui",
  96.     .long_name    = NULL_IF_CONFIG_SMALL("Avid Meridien Uncompressed"),
  97.     .type         = AVMEDIA_TYPE_VIDEO,
  98.     .id           = AV_CODEC_ID_AVUI,
  99.     .init         = avui_encode_init,
  100.     .encode2      = avui_encode_frame,
  101.     .capabilities = AV_CODEC_CAP_EXPERIMENTAL | AV_CODEC_CAP_INTRA_ONLY,
  102.     .pix_fmts     = (const enum AVPixelFormat[]){ AV_PIX_FMT_UYVY422, AV_PIX_FMT_NONE },
  103. };
  104.