Subversion Repositories Kolibri OS

Rev

Blame | Last modification | View Log | RSS feed

  1. /*
  2.  * Dirac encoder support via Schroedinger libraries
  3.  * Copyright (c) 2008 BBC, Anuradha Suraparaju <asuraparaju 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. /**
  23. * @file
  24. * Dirac encoder support via libschroedinger-1.0 libraries. More details about
  25. * the Schroedinger project can be found at http://www.diracvideo.org/.
  26. * The library implements Dirac Specification Version 2.2
  27. * (http://dirac.sourceforge.net/specification.html).
  28. */
  29.  
  30. #include <schroedinger/schro.h>
  31. #include <schroedinger/schrodebug.h>
  32. #include <schroedinger/schrovideoformat.h>
  33.  
  34. #include "libavutil/attributes.h"
  35. #include "libavutil/avassert.h"
  36. #include "avcodec.h"
  37. #include "internal.h"
  38. #include "libschroedinger.h"
  39. #include "bytestream.h"
  40.  
  41.  
  42. /** libschroedinger encoder private data */
  43. typedef struct SchroEncoderParams {
  44.     /** Schroedinger video format */
  45.     SchroVideoFormat *format;
  46.  
  47.     /** Schroedinger frame format */
  48.     SchroFrameFormat frame_format;
  49.  
  50.     /** frame size */
  51.     int frame_size;
  52.  
  53.     /** Schroedinger encoder handle*/
  54.     SchroEncoder* encoder;
  55.  
  56.     /** buffer to store encoder output before writing it to the frame queue*/
  57.     unsigned char *enc_buf;
  58.  
  59.     /** Size of encoder buffer*/
  60.     int enc_buf_size;
  61.  
  62.     /** queue storing encoded frames */
  63.     FFSchroQueue enc_frame_queue;
  64.  
  65.     /** end of sequence signalled */
  66.     int eos_signalled;
  67.  
  68.     /** end of sequence pulled */
  69.     int eos_pulled;
  70.  
  71.     /* counter for frames submitted to encoder, used as dts */
  72.     int64_t dts;
  73. } SchroEncoderParams;
  74.  
  75. /**
  76. * Works out Schro-compatible chroma format.
  77. */
  78. static int set_chroma_format(AVCodecContext *avctx)
  79. {
  80.     int num_formats = sizeof(schro_pixel_format_map) /
  81.                       sizeof(schro_pixel_format_map[0]);
  82.     int idx;
  83.  
  84.     SchroEncoderParams *p_schro_params = avctx->priv_data;
  85.  
  86.     for (idx = 0; idx < num_formats; ++idx) {
  87.         if (schro_pixel_format_map[idx].ff_pix_fmt == avctx->pix_fmt) {
  88.             p_schro_params->format->chroma_format =
  89.                             schro_pixel_format_map[idx].schro_pix_fmt;
  90.             return 0;
  91.         }
  92.     }
  93.  
  94.     av_log(avctx, AV_LOG_ERROR,
  95.            "This codec currently only supports planar YUV 4:2:0, 4:2:2"
  96.            " and 4:4:4 formats.\n");
  97.  
  98.     return -1;
  99. }
  100.  
  101. static av_cold int libschroedinger_encode_init(AVCodecContext *avctx)
  102. {
  103.     SchroEncoderParams *p_schro_params = avctx->priv_data;
  104.     SchroVideoFormatEnum preset;
  105.  
  106.     /* Initialize the libraries that libschroedinger depends on. */
  107.     schro_init();
  108.  
  109.     /* Create an encoder object. */
  110.     p_schro_params->encoder = schro_encoder_new();
  111.  
  112.     if (!p_schro_params->encoder) {
  113.         av_log(avctx, AV_LOG_ERROR,
  114.                "Unrecoverable Error: schro_encoder_new failed. ");
  115.         return -1;
  116.     }
  117.  
  118.     /* Initialize the format. */
  119.     preset = ff_get_schro_video_format_preset(avctx);
  120.     p_schro_params->format =
  121.                     schro_encoder_get_video_format(p_schro_params->encoder);
  122.     schro_video_format_set_std_video_format(p_schro_params->format, preset);
  123.     p_schro_params->format->width  = avctx->width;
  124.     p_schro_params->format->height = avctx->height;
  125.  
  126.     if (set_chroma_format(avctx) == -1)
  127.         return -1;
  128.  
  129.     if (avctx->color_primaries == AVCOL_PRI_BT709) {
  130.         p_schro_params->format->colour_primaries = SCHRO_COLOUR_PRIMARY_HDTV;
  131.     } else if (avctx->color_primaries == AVCOL_PRI_BT470BG) {
  132.         p_schro_params->format->colour_primaries = SCHRO_COLOUR_PRIMARY_SDTV_625;
  133.     } else if (avctx->color_primaries == AVCOL_PRI_SMPTE170M) {
  134.         p_schro_params->format->colour_primaries = SCHRO_COLOUR_PRIMARY_SDTV_525;
  135.     }
  136.  
  137.     if (avctx->colorspace == AVCOL_SPC_BT709) {
  138.         p_schro_params->format->colour_matrix = SCHRO_COLOUR_MATRIX_HDTV;
  139.     } else if (avctx->colorspace == AVCOL_SPC_BT470BG) {
  140.         p_schro_params->format->colour_matrix = SCHRO_COLOUR_MATRIX_SDTV;
  141.     }
  142.  
  143.     if (avctx->color_trc == AVCOL_TRC_BT709) {
  144.         p_schro_params->format->transfer_function = SCHRO_TRANSFER_CHAR_TV_GAMMA;
  145.     }
  146.  
  147.     if (ff_get_schro_frame_format(p_schro_params->format->chroma_format,
  148.                                   &p_schro_params->frame_format) == -1) {
  149.         av_log(avctx, AV_LOG_ERROR,
  150.                "This codec currently supports only planar YUV 4:2:0, 4:2:2"
  151.                " and 4:4:4 formats.\n");
  152.         return -1;
  153.     }
  154.  
  155.     p_schro_params->format->frame_rate_numerator   = avctx->time_base.den;
  156.     p_schro_params->format->frame_rate_denominator = avctx->time_base.num;
  157.  
  158.     p_schro_params->frame_size = avpicture_get_size(avctx->pix_fmt,
  159.                                                     avctx->width,
  160.                                                     avctx->height);
  161.  
  162.     if (!avctx->gop_size) {
  163.         schro_encoder_setting_set_double(p_schro_params->encoder,
  164.                                          "gop_structure",
  165.                                          SCHRO_ENCODER_GOP_INTRA_ONLY);
  166.  
  167.         if (avctx->coder_type == FF_CODER_TYPE_VLC)
  168.             schro_encoder_setting_set_double(p_schro_params->encoder,
  169.                                              "enable_noarith", 1);
  170.     } else {
  171.         schro_encoder_setting_set_double(p_schro_params->encoder,
  172.                                          "au_distance", avctx->gop_size);
  173.         avctx->has_b_frames = 1;
  174.         p_schro_params->dts = -1;
  175.     }
  176.  
  177.     /* FIXME - Need to handle SCHRO_ENCODER_RATE_CONTROL_LOW_DELAY. */
  178.     if (avctx->flags & AV_CODEC_FLAG_QSCALE) {
  179.         if (!avctx->global_quality) {
  180.             /* lossless coding */
  181.             schro_encoder_setting_set_double(p_schro_params->encoder,
  182.                                              "rate_control",
  183.                                              SCHRO_ENCODER_RATE_CONTROL_LOSSLESS);
  184.         } else {
  185.             int quality;
  186.             schro_encoder_setting_set_double(p_schro_params->encoder,
  187.                                              "rate_control",
  188.                                              SCHRO_ENCODER_RATE_CONTROL_CONSTANT_QUALITY);
  189.  
  190.             quality = avctx->global_quality / FF_QP2LAMBDA;
  191.             if (quality > 10)
  192.                 quality = 10;
  193.             schro_encoder_setting_set_double(p_schro_params->encoder,
  194.                                              "quality", quality);
  195.         }
  196.     } else {
  197.         schro_encoder_setting_set_double(p_schro_params->encoder,
  198.                                          "rate_control",
  199.                                          SCHRO_ENCODER_RATE_CONTROL_CONSTANT_BITRATE);
  200.  
  201.         schro_encoder_setting_set_double(p_schro_params->encoder,
  202.                                          "bitrate", avctx->bit_rate);
  203.     }
  204.  
  205.     if (avctx->flags & AV_CODEC_FLAG_INTERLACED_ME)
  206.         /* All material can be coded as interlaced or progressive
  207.            irrespective of the type of source material. */
  208.         schro_encoder_setting_set_double(p_schro_params->encoder,
  209.                                          "interlaced_coding", 1);
  210.  
  211.     schro_encoder_setting_set_double(p_schro_params->encoder, "open_gop",
  212.                                      !(avctx->flags & AV_CODEC_FLAG_CLOSED_GOP));
  213.  
  214.     /* FIXME: Signal range hardcoded to 8-bit data until both libschroedinger
  215.      * and libdirac support other bit-depth data. */
  216.     schro_video_format_set_std_signal_range(p_schro_params->format,
  217.                                             SCHRO_SIGNAL_RANGE_8BIT_VIDEO);
  218.  
  219.     /* Set the encoder format. */
  220.     schro_encoder_set_video_format(p_schro_params->encoder,
  221.                                    p_schro_params->format);
  222.  
  223.     /* Set the debug level. */
  224.     schro_debug_set_level(avctx->debug);
  225.  
  226.     schro_encoder_start(p_schro_params->encoder);
  227.  
  228.     /* Initialize the encoded frame queue. */
  229.     ff_schro_queue_init(&p_schro_params->enc_frame_queue);
  230.     return 0;
  231. }
  232.  
  233. static SchroFrame *libschroedinger_frame_from_data(AVCodecContext *avctx,
  234.                                                    const AVFrame *frame)
  235. {
  236.     SchroEncoderParams *p_schro_params = avctx->priv_data;
  237.     SchroFrame *in_frame;
  238.     /* Input line size may differ from what the codec supports. Especially
  239.      * when transcoding from one format to another. So use avpicture_layout
  240.      * to copy the frame. */
  241.     in_frame = ff_create_schro_frame(avctx, p_schro_params->frame_format);
  242.  
  243.     if (in_frame)
  244.         avpicture_layout((const AVPicture *)frame, avctx->pix_fmt,
  245.                           avctx->width, avctx->height,
  246.                           in_frame->components[0].data,
  247.                           p_schro_params->frame_size);
  248.  
  249.     return in_frame;
  250. }
  251.  
  252. static void libschroedinger_free_frame(void *data)
  253. {
  254.     FFSchroEncodedFrame *enc_frame = data;
  255.  
  256.     av_freep(&enc_frame->p_encbuf);
  257.     av_free(enc_frame);
  258. }
  259.  
  260. static int libschroedinger_encode_frame(AVCodecContext *avctx, AVPacket *pkt,
  261.                                         const AVFrame *frame, int *got_packet)
  262. {
  263.     int enc_size = 0;
  264.     SchroEncoderParams *p_schro_params = avctx->priv_data;
  265.     SchroEncoder *encoder = p_schro_params->encoder;
  266.     struct FFSchroEncodedFrame *p_frame_output = NULL;
  267.     int go = 1;
  268.     SchroBuffer *enc_buf;
  269.     int presentation_frame;
  270.     int parse_code;
  271.     int last_frame_in_sequence = 0;
  272.     int pkt_size, ret;
  273.  
  274.     if (!frame) {
  275.         /* Push end of sequence if not already signalled. */
  276.         if (!p_schro_params->eos_signalled) {
  277.             schro_encoder_end_of_stream(encoder);
  278.             p_schro_params->eos_signalled = 1;
  279.         }
  280.     } else {
  281.         /* Allocate frame data to schro input buffer. */
  282.         SchroFrame *in_frame = libschroedinger_frame_from_data(avctx, frame);
  283.         if (!in_frame)
  284.             return AVERROR(ENOMEM);
  285.         /* Load next frame. */
  286.         schro_encoder_push_frame(encoder, in_frame);
  287.     }
  288.  
  289.     if (p_schro_params->eos_pulled)
  290.         go = 0;
  291.  
  292.     /* Now check to see if we have any output from the encoder. */
  293.     while (go) {
  294.         int err;
  295.         SchroStateEnum state;
  296.         state = schro_encoder_wait(encoder);
  297.         switch (state) {
  298.         case SCHRO_STATE_HAVE_BUFFER:
  299.         case SCHRO_STATE_END_OF_STREAM:
  300.             enc_buf = schro_encoder_pull(encoder, &presentation_frame);
  301.             if (enc_buf->length <= 0)
  302.                 return AVERROR_BUG;
  303.             parse_code = enc_buf->data[4];
  304.  
  305.             /* All non-frame data is prepended to actual frame data to
  306.              * be able to set the pts correctly. So we don't write data
  307.              * to the frame output queue until we actually have a frame
  308.              */
  309.             if ((err = av_reallocp(&p_schro_params->enc_buf,
  310.                                    p_schro_params->enc_buf_size +
  311.                                    enc_buf->length)) < 0) {
  312.                 p_schro_params->enc_buf_size = 0;
  313.                 return err;
  314.             }
  315.  
  316.             memcpy(p_schro_params->enc_buf + p_schro_params->enc_buf_size,
  317.                    enc_buf->data, enc_buf->length);
  318.             p_schro_params->enc_buf_size += enc_buf->length;
  319.  
  320.  
  321.             if (state == SCHRO_STATE_END_OF_STREAM) {
  322.                 p_schro_params->eos_pulled = 1;
  323.                 go = 0;
  324.             }
  325.  
  326.             if (!SCHRO_PARSE_CODE_IS_PICTURE(parse_code)) {
  327.                 schro_buffer_unref(enc_buf);
  328.                 break;
  329.             }
  330.  
  331.             /* Create output frame. */
  332.             p_frame_output = av_mallocz(sizeof(FFSchroEncodedFrame));
  333.             if (!p_frame_output)
  334.                 return AVERROR(ENOMEM);
  335.             /* Set output data. */
  336.             p_frame_output->size     = p_schro_params->enc_buf_size;
  337.             p_frame_output->p_encbuf = p_schro_params->enc_buf;
  338.             if (SCHRO_PARSE_CODE_IS_INTRA(parse_code) &&
  339.                 SCHRO_PARSE_CODE_IS_REFERENCE(parse_code))
  340.                 p_frame_output->key_frame = 1;
  341.  
  342.             /* Parse the coded frame number from the bitstream. Bytes 14
  343.              * through 17 represesent the frame number. */
  344.             p_frame_output->frame_num = AV_RB32(enc_buf->data + 13);
  345.  
  346.             ff_schro_queue_push_back(&p_schro_params->enc_frame_queue,
  347.                                      p_frame_output);
  348.             p_schro_params->enc_buf_size = 0;
  349.             p_schro_params->enc_buf      = NULL;
  350.  
  351.             schro_buffer_unref(enc_buf);
  352.  
  353.             break;
  354.  
  355.         case SCHRO_STATE_NEED_FRAME:
  356.             go = 0;
  357.             break;
  358.  
  359.         case SCHRO_STATE_AGAIN:
  360.             break;
  361.  
  362.         default:
  363.             av_log(avctx, AV_LOG_ERROR, "Unknown Schro Encoder state\n");
  364.             return -1;
  365.         }
  366.     }
  367.  
  368.     /* Copy 'next' frame in queue. */
  369.  
  370.     if (p_schro_params->enc_frame_queue.size == 1 &&
  371.         p_schro_params->eos_pulled)
  372.         last_frame_in_sequence = 1;
  373.  
  374.     p_frame_output = ff_schro_queue_pop(&p_schro_params->enc_frame_queue);
  375.  
  376.     if (!p_frame_output)
  377.         return 0;
  378.  
  379.     pkt_size = p_frame_output->size;
  380.     if (last_frame_in_sequence && p_schro_params->enc_buf_size > 0)
  381.         pkt_size += p_schro_params->enc_buf_size;
  382.     if ((ret = ff_alloc_packet2(avctx, pkt, pkt_size, 0)) < 0)
  383.         goto error;
  384.  
  385.     memcpy(pkt->data, p_frame_output->p_encbuf, p_frame_output->size);
  386. #if FF_API_CODED_FRAME
  387. FF_DISABLE_DEPRECATION_WARNINGS
  388.     avctx->coded_frame->key_frame = p_frame_output->key_frame;
  389.     avctx->coded_frame->pts = p_frame_output->frame_num;
  390. FF_ENABLE_DEPRECATION_WARNINGS
  391. #endif
  392.     /* Use the frame number of the encoded frame as the pts. It is OK to
  393.      * do so since Dirac is a constant frame rate codec. It expects input
  394.      * to be of constant frame rate. */
  395.     pkt->pts = p_frame_output->frame_num;
  396.     pkt->dts = p_schro_params->dts++;
  397.     enc_size = p_frame_output->size;
  398.  
  399.     /* Append the end of sequence information to the last frame in the
  400.      * sequence. */
  401.     if (last_frame_in_sequence && p_schro_params->enc_buf_size > 0) {
  402.         memcpy(pkt->data + enc_size, p_schro_params->enc_buf,
  403.                p_schro_params->enc_buf_size);
  404.         enc_size += p_schro_params->enc_buf_size;
  405.         av_freep(&p_schro_params->enc_buf);
  406.         p_schro_params->enc_buf_size = 0;
  407.     }
  408.  
  409.     if (p_frame_output->key_frame)
  410.         pkt->flags |= AV_PKT_FLAG_KEY;
  411.     *got_packet = 1;
  412.  
  413. error:
  414.     /* free frame */
  415.     libschroedinger_free_frame(p_frame_output);
  416.     return ret;
  417. }
  418.  
  419.  
  420. static int libschroedinger_encode_close(AVCodecContext *avctx)
  421. {
  422.     SchroEncoderParams *p_schro_params = avctx->priv_data;
  423.  
  424.     /* Close the encoder. */
  425.     schro_encoder_free(p_schro_params->encoder);
  426.  
  427.     /* Free data in the output frame queue. */
  428.     ff_schro_queue_free(&p_schro_params->enc_frame_queue,
  429.                         libschroedinger_free_frame);
  430.  
  431.  
  432.     /* Free the encoder buffer. */
  433.     if (p_schro_params->enc_buf_size)
  434.         av_freep(&p_schro_params->enc_buf);
  435.  
  436.     /* Free the video format structure. */
  437.     av_freep(&p_schro_params->format);
  438.  
  439.     return 0;
  440. }
  441.  
  442.  
  443. AVCodec ff_libschroedinger_encoder = {
  444.     .name           = "libschroedinger",
  445.     .long_name      = NULL_IF_CONFIG_SMALL("libschroedinger Dirac 2.2"),
  446.     .type           = AVMEDIA_TYPE_VIDEO,
  447.     .id             = AV_CODEC_ID_DIRAC,
  448.     .priv_data_size = sizeof(SchroEncoderParams),
  449.     .init           = libschroedinger_encode_init,
  450.     .encode2        = libschroedinger_encode_frame,
  451.     .close          = libschroedinger_encode_close,
  452.     .capabilities   = AV_CODEC_CAP_DELAY,
  453.     .pix_fmts       = (const enum AVPixelFormat[]){
  454.         AV_PIX_FMT_YUV420P, AV_PIX_FMT_YUV422P, AV_PIX_FMT_YUV444P, AV_PIX_FMT_NONE
  455.     },
  456. };
  457.