📄 lqt_ffmpeg.c
字号:
/******************************************************************************* 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 + -