JM8.6 인코더의 Configure 함수는 도대체 무엇을 했습니까?(프로그래밍 사상: 추상, 간접)
다른 사람이 쓴 소프트웨어를 사용할 때 우리는 항상 소프트웨어의 인터페이스의 어떤 대화상자에 파라미터를 입력한다. 그리고 소프트웨어 안의 프로그램은 이 대화상자 안의 파라미터를 포착하여 사용자가 설정한 파라미터를 프로그램에 전송한다.곰곰이 생각해 봐, JM8.6 인코더에서 이렇습니다. 이곳의 "대화상자"는 사실상 설정 파일입니다. 예를 들어: encoderbaseline.cfg. 그런데 왜 이런 프로필이 필요합니까?원인은 간단하다. 추상적이고 간접적이다.추상은 더욱 잘 중용하기 위한 것이다.간접적으로 직책의 분리를 실현할 수 있다. 즉, 사용자는 프로필을 통해 자신이 사용하고 싶은 파라미터를 설정할 수 있고 소프트웨어의 프로그램을 수정할 필요가 없다.
인코더의 글로벌에 있는 구조체 형식인 InputParameters를 간단하게 보십시오.h에서는 이렇게 정의합니다.
typedef struct
{
//
int ProfileIDC; //!< profile idc
//
int LevelIDC; //!< level idc
//
int no_frames; //!< number of frames to be encoded
// QP
int qp0; //!< QP of first frame
// QP
int qpN; //!< QP of remaining frames
// n
int jumpd; //!< number of frames to skip in input sequence (e.g 2 takes frame 0,3,6,9...)
int hadamard; /*!< 0: 'normal' SAD in 1/3 pixel search. 1: use 4x4 Haphazard transform and '
Sum of absolute transform difference' in 1/3 pixel search */
//
int search_range; /*!< search range - integer pel search and 16x16 blocks. The search window is
generally around the predicted vector. Max vector is 2xmcrange. For 8x8
and 4x4 block sizes the search range is 1/2 of that for 16x16 blocks. */
//
int num_reference_frames; //!< number of reference frames to be used
int P_List0_refs;
int B_List0_refs;
int B_List1_refs;
// MB
int img_width; //!< image width (must be a multiple of 16 pels)
int img_height; //!< image height (must be a multiple of 16 pels)
// 4 : 2 : 0
int yuv_format; //!< GH: YUV format (0=4:0:0, 1=4:2:0, 2=4:2:2, 3=4:4:4,currently only 4:2:0 is supported)
// 8
int color_depth; //!< GH: YUV color depth per component in bit/pel (currently only 8 bit/pel is supported)
int intra_upd; /*!< For error robustness. 0: no special action. 1: One GOB/frame is intra coded
as regular 'update'. 2: One GOB every 2 frames is intra coded etc.
In connection with this intra update, restrictions is put on motion vectors
to prevent errors to propagate from the past */
int blc_size[8][2]; //!< array for different block sizes
int slice_mode; //!< Indicate what algorithm to use for setting slices
int slice_argument; //!< Argument to the specified slice algorithm
//
int UseConstrainedIntraPred; //!< 0: Inter MB pixels are allowed for intra prediction 1: Not allowed
int infile_header; //!< If input file has a header set this to the length of the header
// , , , . (4 )
char infile[100]; //!< YUV 4:2:0 input format
char outfile[100]; //!< H.264 compressed output bitstream
char ReconFile[100]; //!< Reconstructed Pictures
char TraceFile[100]; //!< Trace Outputs
int intra_period; //!< Random Access period though intra
// IDR
int idr_enable; //!< Encode intra slices as IDR
//
int start_frame; //!< Encode sequence starting from Frame start_frame
// B pictures
int successive_Bframe; //!< number of B frames that will be used
int qpB; //!< QP of B frames
int direct_type; //!< Direct Mode type to be used (0: Temporal, 1: Spatial)
int directInferenceFlag; //!< Direct Inference Flag
// SP Pictures
int sp_periodicity; //!< The periodicity of SP-pictures
int qpsp; //!< SP Picture QP for prediction error
int qpsp_pred; //!< SP Picture QP for predicted block
int WeightedPrediction; //!< Weighted prediciton for P frames (0: not used, 1: explicit)
int WeightedBiprediction; //!< Weighted prediciton for B frames (0: not used, 1: explicit, 2: implicit)
int StoredBPictures; //!< Stored (Reference) B pictures replace P pictures (0: not used, 1: used)
//
int symbol_mode; //!< Specifies the mode the symbols are mapped on bits
// (output file mode) 0:Annex B, 1:RTP
int of_mode; //!< Specifies the mode of the output file
//
int partition_mode; //!< Specifies the mode of data partitioning
//
int InterSearch16x16;
int InterSearch16x8;
int InterSearch8x16;
int InterSearch8x8;
int InterSearch8x4;
int InterSearch4x8;
int InterSearch4x4;
char PictureTypeSequence[MAXPICTURETYPESEQUENCELEN];
int FrameRate;
int chroma_qp_index_offset;
#ifdef _FULL_SEARCH_RANGE_
int full_search;
#endif
#ifdef _ADAPT_LAST_GROUP_
int last_frame;
#endif
#ifdef _CHANGE_QP_
int qpN2, qpB2, qp2start;
int qp02;
#endif
int rdopt;
#ifdef _LEAKYBUCKET_
int NumberLeakyBuckets;
char LeakyBucketRateFile[100];
char LeakyBucketParamFile[100];
#endif
int PicInterlace; //!< picture adaptive frame/field
int MbInterlace; //!< macroblock adaptive frame/field
int IntraBottom; //!< Force Intra Bottom at GOP periods.
int LossRateA; //!< assumed loss probablility of partition A (or full slice), in per cent, used for loss-aware R/D optimization
int LossRateB; //!< assumed loss probablility of partition B, in per cent, used for loss-aware R/D
int LossRateC; //!< assumed loss probablility of partition C, in per cent, used for loss-aware R/D
int NoOfDecoders;
int RestrictRef;
int NumFramesInELSubSeq;
int NumFrameIn2ndIGOP;
int RandomIntraMBRefresh; //!< Number of pseudo-random intra-MBs per picture
int LFSendParameters;
int LFDisableIdc;
int LFAlphaC0Offset;
int LFBetaOffset;
int SparePictureOption;
int SPDetectionThreshold;
int SPPercentageThreshold;
// FMO
char SliceGroupConfigFileName[100]; //!< Filename for config info fot type 0, 2, 6
int num_slice_groups_minus1; //!< "FmoNumSliceGroups" in encoder.cfg, same as FmoNumSliceGroups, which should be erased later
int slice_group_map_type;
int *top_left; //!< top_left and bottom_right store values indicating foregrounds
int *bottom_right;
int *slice_group_id; //!< slice_group_id is for slice group type being 6
int *run_length_minus1; //!< run_length_minus1 is for slice group type being 0
int slice_group_change_direction_flag;
int slice_group_change_rate_minus1;
int slice_group_change_cycle;
int redundant_slice_flag; //! whether redundant slices exist, JVT-D101
int pic_order_cnt_type; // POC200301
int context_init_method;
int model_number;
//! Rate Control on JVT standard
int RCEnable;
int bit_rate;
int SeinitialQP;
int basicunit;
int channel_type;
// FastME enable( )
int FMEnable;
} InputParameters;
이를 통해 알 수 있듯이 InputParameters 구조체의 유형은 실제적으로 각종 입력 매개 변수에 대한 하나의 패키지이다.lencod에 있습니다.c에는 다음과 같은 글로벌 변수 정의가 있습니다.
InputParameters inputs, *input = &inputs;
최종 프로필의 정보는 input->로 가져옵니다...안쪽, 그럼 도대체 어떻게 도입해야 하나요?Configure 함수에 따라 다릅니다. main에서 Configure 함수는 이렇게 호출됩니다.
Configure (argc, argv);
전형적인 정상적인 설정(VC6.0에서 설정할 수 있음),argc=3,argv[0]는'...lencod.exe'를 가리키고,argv[1]는'-d'를 가리키며,argv[2]는'encoder baseline.cfg'을 가리킨다. 즉,argc와argv가 있으면 설정 파일의 이름이 생긴다.다음은 Configure 함수로 들어가 보겠습니다. (설명, 프로그램이 정상적으로 들어간 부분만 표시하고 설명만 표시함)
void Configure(int ac, char *av[])
{
char *content, *filename;
//configinput configfile.h :InputParameters configinput;
// configinput 0
memset (&configinput, 0, sizeof (InputParameters));
configinput.LevelIDC = LEVEL_IDC;
configinput.ProfileIDC = PROFILE_IDC;
filename = av[2]; // "encoder_baseline.cfg"
//content , ,
content = GetConfigFileContent (filename);
// content
// lencod.c input->...
ParseContent (content, strlen(content));
free (content);
PatchInp();// input->...
}
원래,Configure 함수는 전문적으로 이 일을 하는 것이다.
이 내용에 흥미가 있습니까?
현재 기사가 여러분의 문제를 해결하지 못하는 경우 AI 엔진은 머신러닝 분석(스마트 모델이 방금 만들어져 부정확한 경우가 있을 수 있음)을 통해 가장 유사한 기사를 추천합니다:
다양한 언어의 JSONJSON은 Javascript 표기법을 사용하여 데이터 구조를 레이아웃하는 데이터 형식입니다. 그러나 Javascript가 코드에서 이러한 구조를 나타낼 수 있는 유일한 언어는 아닙니다. 저는 일반적으로 '객체'{}...
텍스트를 자유롭게 공유하거나 복사할 수 있습니다.하지만 이 문서의 URL은 참조 URL로 남겨 두십시오.
CC BY-SA 2.5, CC BY-SA 3.0 및 CC BY-SA 4.0에 따라 라이센스가 부여됩니다.