JM8.6 인코더의 Configure 함수는 도대체 무엇을 했습니까?(프로그래밍 사상: 추상, 간접)

10000 단어
글자의 뜻으로 볼 때 configure는 설정이라는 뜻이고 말 그대로 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 함수는 전문적으로 이 일을 하는 것이다.
 
 
     
 

좋은 웹페이지 즐겨찾기