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

📄 lqt_ffmpeg.c

📁 这个库实现了录象功能
💻 C
📖 第 1 页 / 共 3 页
字号:
/******************************************************************************* lqt_ffmpeg.c libquicktime - A library for reading and writing quicktime/avi/mp4 files. http://libquicktime.sourceforge.net Copyright (C) 2002 Heroine Virtual Ltd. Copyright (C) 2002-2007 Members of the libquicktime project. This library 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. This library 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 this library; if not, write to the Free Software Foundation, Inc., 51 Franklin Street, Fifth Floor, Boston, MA 02110-1301 USA*******************************************************************************/ /* WARNING: Don't even think about adding support   for ffmpeg's PCM codecs because they will crash.   */#include "lqt_private.h"#include "ffmpeg.h"#include "params.h"#include <quicktime/lqt_codecapi.h>#include <stdio.h>#define LOG_DOMAIN "ffmpeg"#define MAX_FOURCCS 30#define MAX_WAV_IDS 4int ffmpeg_num_audio_codecs = -1;int ffmpeg_num_video_codecs = -1;  #define ENCODE_PARAM_AUDIO \  { \    .name =        "bit_rate_audio", \    .real_name =   TRS("Bit rate (kbps)"),      \    .type =        LQT_PARAMETER_INT, \    .val_default = { .val_int = 128 }, \  }#define ENCODE_PARAM_VIDEO_RATECONTROL \  { \    .name =      "rate_control", \    .real_name = TRS("Rate control"),   \    .type =      LQT_PARAMETER_SECTION, \  }, \    PARAM_BITRATE_VIDEO, \    PARAM_BITRATE_TOLERANCE, \    PARAM_RC_MIN_RATE, \    PARAM_RC_MAX_RATE, \    PARAM_RC_BUFFER_SIZE, \    PARAM_RC_INITIAL_COMPLEX, \    PARAM_RC_INITIAL_BUFFER_OCCUPANCY#define ENCODE_PARAM_VIDEO_QUANTIZER_I \  { \    .name =      "quantizer", \    .real_name = TRS("Quantizer"),      \    .type =      LQT_PARAMETER_SECTION, \  }, \    PARAM_QMIN, \    PARAM_QMAX, \    PARAM_MAX_QDIFF, \    PARAM_FLAG_QSCALE, \    PARAM_QSCALE, \    PARAM_QCOMPRESS, \    PARAM_QBLUR, \    PARAM_QUANTIZER_NOISE_SHAPING, \    PARAM_TRELLIS#define ENCODE_PARAM_VIDEO_QUANTIZER_IP \  ENCODE_PARAM_VIDEO_QUANTIZER_I, \  PARAM_I_QUANT_FACTOR, \  PARAM_I_QUANT_OFFSET#define ENCODE_PARAM_VIDEO_QUANTIZER_IPB \  ENCODE_PARAM_VIDEO_QUANTIZER_IP, \  PARAM_B_QUANT_FACTOR, \  PARAM_B_QUANT_OFFSET#define ENCODE_PARAM_VIDEO_FRAMETYPES_IP \  { \    .name =      "frame_types", \    .real_name = TRS("Frame types"),    \    .type =      LQT_PARAMETER_SECTION, \  }, \  PARAM_GOP_SIZE, \  PARAM_SCENE_CHANGE_THRESHOLD, \  PARAM_SCENECHANGE_FACTOR, \  PARAM_FLAG_CLOSED_GOP, \  PARAM_FLAG2_STRICT_GOP#define ENCODE_PARAM_VIDEO_FRAMETYPES_IPB \  ENCODE_PARAM_VIDEO_FRAMETYPES_IP, \  PARAM_MAX_B_FRAMES, \  PARAM_B_FRAME_STRATEGY#define ENCODE_PARAM_VIDEO_ME \  { \    .name =      "motion_estimation", \    .real_name = TRS("Motion estimation"),      \    .type =      LQT_PARAMETER_SECTION, \  }, \    PARAM_ME_METHOD,                      \    PARAM_ME_CMP,                      \    PARAM_ME_CMP_CHROMA,\    PARAM_ME_RANGE,\    PARAM_ME_THRESHOLD,\    PARAM_MB_DECISION,\    PARAM_DIA_SIZE#define ENCODE_PARAM_VIDEO_ME_PRE \  { \    .name =      "motion_estimation", \    .real_name = TRS("ME pre-pass"),    \    .type =      LQT_PARAMETER_SECTION, \  }, \    PARAM_PRE_ME,\    PARAM_ME_PRE_CMP,\    PARAM_ME_PRE_CMP_CHROMA,\    PARAM_PRE_DIA_SIZE#define ENCODE_PARAM_VIDEO_QPEL \  { \    .name =      "qpel_motion_estimation", \    .real_name = TRS("Qpel ME"),           \    .type =      LQT_PARAMETER_SECTION, \  }, \    PARAM_FLAG_QPEL, \    PARAM_ME_SUB_CMP,\    PARAM_ME_SUB_CMP_CHROMA,\    PARAM_ME_SUBPEL_QUALITY#define ENCODE_PARAM_VIDEO_MASKING \  { \    .name =      "masking", \    .real_name = TRS("Masking"),        \    .type =      LQT_PARAMETER_SECTION, \  }, \    PARAM_LUMI_MASKING, \    PARAM_DARK_MASKING, \    PARAM_TEMPORAL_CPLX_MASKING, \    PARAM_SPATIAL_CPLX_MASKING, \    PARAM_BORDER_MASKING, \    PARAM_P_MASKING, \    PARAM_FLAG_NORMALIZE_AQP#define ENCODE_PARAM_VIDEO_MISC \  { \    .name =      "misc", \    .real_name = TRS("Misc"),           \    .type =      LQT_PARAMETER_SECTION, \  }, \    PARAM_STRICT_STANDARD_COMPLIANCE, \    PARAM_NOISE_REDUCTION, \    PARAM_FLAG_GRAY, \    PARAM_FLAG_BITEXACT    #define DECODE_PARAM_AUDIO#define DECODE_PARAM_VIDEO \  PARAM_FLAG_GRAYstatic lqt_parameter_info_static_t encode_parameters_mpeg4[] = {  ENCODE_PARAM_VIDEO_FRAMETYPES_IPB,  PARAM_FLAG_AC_PRED_MPEG4,  ENCODE_PARAM_VIDEO_RATECONTROL,  ENCODE_PARAM_VIDEO_QUANTIZER_IPB,  PARAM_FLAG_CBP_RD,  ENCODE_PARAM_VIDEO_ME,  PARAM_FLAG_GMC,  PARAM_FLAG_4MV,  PARAM_FLAG_MV0,  PARAM_FLAG_QP_RD,  ENCODE_PARAM_VIDEO_ME_PRE,  ENCODE_PARAM_VIDEO_QPEL,  ENCODE_PARAM_VIDEO_MASKING,  ENCODE_PARAM_VIDEO_MISC,  { /* End of parameters */ }};#if 0static lqt_parameter_info_static_t encode_parameters_dx50[] = {  ENCODE_PARAM_VIDEO_FRAMETYPES_IP,  ENCODE_PARAM_VIDEO_RATECONTROL,  ENCODE_PARAM_VIDEO_QUANTIZER_IP,  ENCODE_PARAM_VIDEO_ME,  ENCODE_PARAM_VIDEO_ME_PRE,  ENCODE_PARAM_VIDEO_MASKING,  ENCODE_PARAM_VIDEO_MISC,  { /* End of parameters */ }};#endifstatic lqt_parameter_info_static_t encode_parameters_h263[] = {  ENCODE_PARAM_VIDEO_FRAMETYPES_IP,  ENCODE_PARAM_VIDEO_RATECONTROL,  ENCODE_PARAM_VIDEO_QUANTIZER_IP,  ENCODE_PARAM_VIDEO_ME,  PARAM_FLAG_4MV,  ENCODE_PARAM_VIDEO_ME_PRE,  ENCODE_PARAM_VIDEO_MASKING,  ENCODE_PARAM_VIDEO_MISC,  PARAM_FLAG_OBMC,  { /* End of parameters */ }};static lqt_parameter_info_static_t encode_parameters_h263p[] = {  ENCODE_PARAM_VIDEO_FRAMETYPES_IP,  ENCODE_PARAM_VIDEO_RATECONTROL,  ENCODE_PARAM_VIDEO_QUANTIZER_IP,  ENCODE_PARAM_VIDEO_ME,  PARAM_FLAG_4MV,  ENCODE_PARAM_VIDEO_ME_PRE,  ENCODE_PARAM_VIDEO_MASKING,  ENCODE_PARAM_VIDEO_MISC,  PARAM_FLAG_H263P_AIV,  PARAM_FLAG_OBMC,  { /* End of parameters */ }};static lqt_parameter_info_static_t encode_parameters_msmpeg4v3[] = {  ENCODE_PARAM_VIDEO_FRAMETYPES_IP,  ENCODE_PARAM_VIDEO_RATECONTROL,  ENCODE_PARAM_VIDEO_QUANTIZER_IP,  ENCODE_PARAM_VIDEO_ME,  ENCODE_PARAM_VIDEO_ME_PRE,  ENCODE_PARAM_VIDEO_MASKING,  ENCODE_PARAM_VIDEO_MISC,  { /* End of parameters */ }};static lqt_parameter_info_static_t encode_parameters_dvvideo[] = {  { /* End of parameters */ }};static lqt_parameter_info_static_t encode_parameters_mjpeg[] = {  ENCODE_PARAM_VIDEO_RATECONTROL,  ENCODE_PARAM_VIDEO_QUANTIZER_I,  ENCODE_PARAM_VIDEO_MASKING,  ENCODE_PARAM_VIDEO_MISC,  { /* End of parameters */ }};static lqt_parameter_info_static_t encode_parameters_audio[] = {  ENCODE_PARAM_AUDIO,  { /* End of parameters */ }};static lqt_parameter_info_static_t decode_parameters_video[] = {  DECODE_PARAM_VIDEO,  { /* End of parameters */ }};static lqt_parameter_info_static_t decode_parameters_audio[] = {  { /* End of parameters */ }};struct CODECIDMAP {	int id;	int index;	AVCodec *encoder;	AVCodec *decoder;        lqt_parameter_info_static_t * encode_parameters;        lqt_parameter_info_static_t * decode_parameters;	char *short_name;	char *name;	char *fourccs[MAX_FOURCCS];        int   wav_ids[MAX_WAV_IDS];        int compatibility_flags;/* *  We explicitely allow, if encoding is allowed. *  This prevents the spreading of broken files */        int   do_encode;   };/* Video; tables from mplayers config... */struct CODECIDMAP codecidmap_v[] =  {    {      .id = CODEC_ID_MPEG1VIDEO,      .index = -1,      .encoder = NULL,      .decoder = NULL,      .decode_parameters = decode_parameters_video,      .short_name = "mpg1",      .name = TRS("FFMPEG Mpeg 1 Video"),      .fourccs = { "mpg1", "MPG1", "pim1", "PIM1", (char *)0 },      .wav_ids = { LQT_WAV_ID_NONE }    },    {      .id = CODEC_ID_MPEG4,      .index = -1,      .encoder = NULL,      .decoder = NULL,      .encode_parameters = encode_parameters_mpeg4,      .decode_parameters = decode_parameters_video,      .short_name = "mpg4",      .name = TRS("FFMPEG MPEG-4"),      .fourccs = { "mp4v", "divx", "DIV1", "div1", "MP4S", "mp4s",                   "M4S2", "m4s2", "xvid", "XVID", "XviD", "DX50",                   "dx50", "DIVX", "MP4V", "3IV2", (char *)0 },      .wav_ids = { LQT_WAV_ID_NONE },      .compatibility_flags = LQT_FILE_QT_OLD | LQT_FILE_QT | LQT_FILE_MP4 |                             LQT_FILE_3GP,      .do_encode = 1    },    {      .id = CODEC_ID_MSMPEG4V1,      .index = -1,      .encoder = NULL,      .decoder = NULL,      .decode_parameters = decode_parameters_video,      .short_name = "msmpeg4v1",      .name = TRS("FFMPEG MSMpeg 4v1"),      .fourccs = { "DIV1", "div1", "MPG4", "mpg4", (char *)0 },      .wav_ids = { LQT_WAV_ID_NONE },    },    {      .id = CODEC_ID_MSMPEG4V2,      .index = -1,      .encoder = NULL,      .decoder = NULL,      .decode_parameters = decode_parameters_video,      .short_name = "msmpeg4v2",      .name = TRS("FFMPEG MSMpeg 4v2"),      .fourccs = { "DIV2", "div2", "MP42", "mp42", (char *)0 },      .wav_ids = { LQT_WAV_ID_NONE },    },    {      .id = CODEC_ID_MSMPEG4V3,      .index = -1,      .encoder = NULL,      .decoder = NULL,      .encode_parameters = encode_parameters_msmpeg4v3,      .decode_parameters = decode_parameters_video,      .short_name = "msmpeg4v3",      .name = TRS("FFMPEG MSMpeg 4v3 (DivX 3 compatible)"),      .fourccs = { "DIV3", "mpg3", "MP43", "mp43", "DIV5", "div5", "DIV6",                   "MPG3", "div6", "div3", "DIV4", "div4", "AP41", "ap41",                   "3IVD", (char *)0 },      .wav_ids = { LQT_WAV_ID_NONE },      .compatibility_flags = LQT_FILE_AVI | LQT_FILE_AVI_ODML,      .do_encode = 1,    },    {      .id = CODEC_ID_MSMPEG4V3,      .index = -1,      .encoder = NULL,      .decoder = NULL,      .encode_parameters = encode_parameters_msmpeg4v3,      .decode_parameters = decode_parameters_video,      .short_name = "msmpeg4v3_wmp",      .name = TRS("FFMPEG MSMpeg 4v3 (WMP compatible)"),      .fourccs = { "MP43", (char *)0 },      .wav_ids = { LQT_WAV_ID_NONE },      .compatibility_flags = LQT_FILE_AVI | LQT_FILE_AVI_ODML,      .do_encode = 1,    },#if 0    {      .id = CODEC_ID_WMV1,      .index = -1,      .encoder = NULL,      .decoder = NULL,      .encode_parameters = encode_parameters_mpegvideo,      .decode_parameters = decode_parameters_video,      .short_name = "wmv1",      .name = TRS("FFMPEG WMV1"),      .fourccs = { "WMV1", "wmv1", (char *)0 },      .wav_ids = { LQT_WAV_ID_NONE },    },#endif    {      .id = CODEC_ID_H263,      .index = -1,      .encoder = NULL,      .decoder = NULL,      .decode_parameters = decode_parameters_video,      .short_name = "h263",      .name = TRS("FFMPEG H263"),      .fourccs = { "H263", "h263", "U263", "u263", "s263", (char *)0 },      .wav_ids = { LQT_WAV_ID_NONE },      .compatibility_flags = LQT_FILE_QT_OLD | LQT_FILE_QT | LQT_FILE_MP4 | LQT_FILE_3GP,    },

⌨️ 快捷键说明

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