⭐ 欢迎来到虫虫下载站! | 📦 资源下载 📁 资源专辑 ℹ️ 关于我们
⭐ 虫虫下载站

📄 libschroedingerenc.c

📁 ffmpeg移植到symbian的全部源代码
💻 C
📖 第 1 页 / 共 2 页
字号:
/* * Dirac encoder support via Schroedinger libraries * Copyright (c) 2008 BBC, Anuradha Suraparaju <asuraparaju at gmail dot com > * * This file is part of FFmpeg. * * FFmpeg is free software; you can redistribute it and/or * modify it under the terms of the GNU Lesser General Public * License as published by the Free Software Foundation; either * version 2.1 of the License, or (at your option) any later version. * * FFmpeg is distributed in the hope that it will be useful, * but WITHOUT ANY WARRANTY; without even the implied warranty of * MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE.  See the GNU * Lesser General Public License for more details. * * You should have received a copy of the GNU Lesser General Public * License along with FFmpeg; if not, write to the Free Software * Foundation, Inc., 51 Franklin Street, Fifth Floor, Boston, MA 02110-1301 USA *//*** @file libschroedingerenc.c* Dirac encoder support via libschroedinger-1.0 libraries. More details about* the Schroedinger project can be found at http://www.diracvideo.org/.* The library implements Dirac Specification Version 2.2* (http://dirac.sourceforge.net/specification.html).*/#undef NDEBUG#include <assert.h>#include <schroedinger/schro.h>#include <schroedinger/schrodebug.h>#include <schroedinger/schrovideoformat.h>#include "avcodec.h"#include "libdirac_libschro.h"#include "libschroedinger.h"/** libschroedinger encoder private data */typedef struct FfmpegSchroEncoderParams{    /** Schroedinger video format */    SchroVideoFormat *format;    /** Schroedinger frame format */    SchroFrameFormat frame_format;    /** frame being encoded */    AVFrame picture;    /** frame size */    int frame_size;    /** Schroedinger encoder handle*/    SchroEncoder* encoder;    /** buffer to store encoder output before writing it to the frame queue*/    unsigned char *enc_buf;    /** Size of encoder buffer*/    int enc_buf_size;    /** queue storing encoded frames */    FfmpegDiracSchroQueue enc_frame_queue;    /** end of sequence signalled */    int eos_signalled;    /** end of sequence pulled */    int eos_pulled;} FfmpegSchroEncoderParams;/*** Works out Schro-compatible chroma format.*/static int SetSchroChromaFormat(AVCodecContext *avccontext){    int num_formats = sizeof(ffmpeg_schro_pixel_format_map) /                      sizeof(ffmpeg_schro_pixel_format_map[0]);    int idx;    FfmpegSchroEncoderParams* p_schro_params = avccontext->priv_data;    for (idx = 0; idx < num_formats; ++idx) {        if (ffmpeg_schro_pixel_format_map[idx].ff_pix_fmt ==                                                       avccontext->pix_fmt) {            p_schro_params->format->chroma_format =                            ffmpeg_schro_pixel_format_map[idx].schro_pix_fmt;            return 0;        }    }    av_log (avccontext, AV_LOG_ERROR,            "This codec currently only supports planar YUV 4:2:0, 4:2:2"            " and 4:4:4 formats.\n");    return -1;}static int libschroedinger_encode_init(AVCodecContext *avccontext){    FfmpegSchroEncoderParams* p_schro_params = avccontext->priv_data;    SchroVideoFormatEnum preset;    /* Initialize the libraries that libschroedinger depends on. */    schro_init();    /* Create an encoder object. */    p_schro_params->encoder = schro_encoder_new();    if (!p_schro_params->encoder) {        av_log(avccontext, AV_LOG_ERROR,               "Unrecoverable Error: schro_encoder_new failed. ");        return -1;    }    /* Initialize the format. */    preset = ff_get_schro_video_format_preset(avccontext);    p_schro_params->format =                    schro_encoder_get_video_format(p_schro_params->encoder);    schro_video_format_set_std_video_format (p_schro_params->format, preset);    p_schro_params->format->width = avccontext->width;    p_schro_params->format->height = avccontext->height;    if (SetSchroChromaFormat(avccontext) == -1)        return -1;    if (ff_get_schro_frame_format(p_schro_params->format->chroma_format,                                  &p_schro_params->frame_format) == -1) {        av_log (avccontext, AV_LOG_ERROR,                "This codec currently supports only planar YUV 4:2:0, 4:2:2"                " and 4:4:4 formats.\n");        return -1;    }    p_schro_params->format->frame_rate_numerator   = avccontext->time_base.den;    p_schro_params->format->frame_rate_denominator = avccontext->time_base.num;    p_schro_params->frame_size = avpicture_get_size(avccontext->pix_fmt,                                                    avccontext->width,                                                    avccontext->height);    avccontext->coded_frame = &p_schro_params->picture;    if (avccontext->gop_size == 0){        schro_encoder_setting_set_double (p_schro_params->encoder,                                          "gop_structure",                                          SCHRO_ENCODER_GOP_INTRA_ONLY);    }    else {        schro_encoder_setting_set_double (p_schro_params->encoder,                                          "gop_structure",                                          SCHRO_ENCODER_GOP_BIREF);        avccontext->has_b_frames = 1;    }    /* FIXME - Need to handle SCHRO_ENCODER_RATE_CONTROL_LOW_DELAY. */    if (avccontext->flags & CODEC_FLAG_QSCALE) {        if (avccontext->global_quality == 0) {            /* lossless coding */            schro_encoder_setting_set_double (p_schro_params->encoder,                                          "rate_control",                                          SCHRO_ENCODER_RATE_CONTROL_LOSSLESS);        } else {            int noise_threshold;            schro_encoder_setting_set_double (p_schro_params->encoder,                          "rate_control",                          SCHRO_ENCODER_RATE_CONTROL_CONSTANT_NOISE_THRESHOLD);            noise_threshold = avccontext->global_quality/FF_QP2LAMBDA;            if (noise_threshold > 100)                noise_threshold = 100;            schro_encoder_setting_set_double (p_schro_params->encoder,                                              "noise_threshold",                                              noise_threshold);        }    }    else {        schro_encoder_setting_set_double ( p_schro_params->encoder,                               "rate_control",                               SCHRO_ENCODER_RATE_CONTROL_CONSTANT_BITRATE);        schro_encoder_setting_set_double (p_schro_params->encoder,                                          "bitrate",                                          avccontext->bit_rate);    }    if (avccontext->flags & CODEC_FLAG_INTERLACED_ME) {        /* All material can be coded as interlaced or progressive           irrespective of the type of source material. */        schro_encoder_setting_set_double (p_schro_params->encoder,                                            "interlaced_coding", 1);    }    /* FIXME: Signal range hardcoded to 8-bit data until both libschroedinger     * and libdirac support other bit-depth data. */    schro_video_format_set_std_signal_range(p_schro_params->format,                                            SCHRO_SIGNAL_RANGE_8BIT_VIDEO);    /* Hardcode motion vector precision to quarter pixel. */    schro_encoder_setting_set_double (p_schro_params->encoder,                                      "mv_precision", 2);    /* Set the encoder format. */    schro_encoder_set_video_format(p_schro_params->encoder,                                   p_schro_params->format);    /* Set the debug level. */    schro_debug_set_level (avccontext->debug);    schro_encoder_start (p_schro_params->encoder);    /* Initialize the encoded frame queue. */    ff_dirac_schro_queue_init (&p_schro_params->enc_frame_queue);    return 0 ;}

⌨️ 快捷键说明

复制代码 Ctrl + C
搜索代码 Ctrl + F
全屏模式 F11
切换主题 Ctrl + Shift + D
显示快捷键 ?
增大字号 Ctrl + =
减小字号 Ctrl + -