ARCHITECTURE
上传用户:hkgotone
上传日期:2013-02-17
资源大小:293k
文件大小:7k
源码类别:

Windows Mobile

开发平台:

C/C++

  1. This file contains a couple of (currently unstructured and incomplete) encoder
  2. implementation notes.
  3. Basic Assumptions
  4. - data structures
  5. Primary data structures are:
  6.  - picture data arrays, containing either source or reconstructed pels
  7.  - mbinfo array, containing all macroblock level side information
  8.  - blocks array, containing DCT coefficients
  9. mbinfo and blocks together are completely equivalent to the VLC encoded
  10. picture_data() part of the MPEG stream, although in uncompressed and
  11. therefore rather voluminous internal format.
  12. a) picture data arrays
  13. Frames are represented internally as in the following declaration:
  14. unsigned char *frame[3];
  15. i.e., an array of three pointers to the picture data proper. frame[0]
  16. points to the luminance (Y) data, frame[1] to the first chrominance (Cb, U)
  17. component, frame[2] to the second chrominance component (Cr, V).
  18. Width and height of the luminance data array is 16*mb_width and 16*mb_height,
  19. even if horizontal_size and vertical_size are not divisible by 16. The
  20. actual pels are top left aligned and padded to the right and bottom (by
  21. pixel replication) while being read into the encoder.
  22. Width and height of the two chrominance arrays depends on the chroma_format.
  23. For 4:2:0 data, they are half size in both directions, for 4:2:2 data only
  24. width is half that of the luminance array, for 4:4:4 data, chrominance and
  25. luminance are of identical size.
  26. The dimensions are stored in the following global variables:
  27.              | horizontal   | vertical
  28. -------------+--------------+------------
  29. luminance    | width        | height
  30. chrominance  | chrom_width  | chrom_height
  31. Picture data (array of pels) is always stored as frames, even when a
  32. field picture sequence is to be generated. The two fields are stored
  33. in interleaved from, that is alternating lines from both fields. In
  34. most cases, however, it's easier to view the two fields as being stored
  35. side to side of each other as an array of double width and half height.
  36. The following picture demonstrates this:
  37.  <----- width --------->
  38.  T1 T1 T1 T1 T1 T1 T1 T1 <+
  39.  B1 B1 B1 B1 B1 B1 B1 B1  |
  40.  T2 T2 T2 T2 T2 T2 T2 T2  | height
  41.  B2 B2 B2 B2 B2 B2 B2 B2  |
  42.  T3 T3 T3 T3 T3 T3 T3 T3  |
  43.  B3 B3 B3 B3 B3 B3 B3 B3 <+
  44.  <------------- 2*width (width2) --------------->
  45.  T1 T1 T1 T1 T1 T1 T1 T1  B1 B1 B1 B1 B1 B1 B1 B1 <+
  46.  T2 T2 T2 T2 T2 T2 T2 T2  B2 B2 B2 B2 B2 B2 B2 B2  | height/2 (height2)
  47.  T3 T3 T3 T3 T3 T3 T3 T3  B3 B3 B3 B3 B3 B3 B3 B3 <+
  48.  Tn: top field pels
  49.  Bn: bottom field pels
  50. These are of cause only two different two-dimensional interpretations of
  51. the same one-dimensional memory layout. Either the top or the bottom field
  52. can be the earlier field in time.
  53. The following table shows the relation between width, height, width2 and
  54. height2 for frame and field pictures:
  55.          | frame  | field
  56.  --------+--------+---------
  57.  width2  | width  | 2*width
  58.  height2 | height | height/2
  59. Using the convenience variables width2 and height2, many loops are
  60. independent of frame / field picture coding.
  61. b) mbinfo array
  62. This array contains the complete encoded picture (field or frame),
  63. except the DCT coefficients. This includes macroblock type, motion vectors,
  64. motion vector type, dct type, quantization parameter etc. The number
  65. of entries (size of the array) is identical to the number of macroblocks
  66. in the picture.
  67. c) blocks
  68. This array contains all DCT coefficients of the picture. It is declared as
  69. EXTERN short (*blocks)[64];
  70. i.e. a pointer to an array whose elements are blocks of 64 short integers
  71. each. The number of blocks is block_count times the number of macroblocks
  72. in the picture. block_count depends on the chroma format (6, 8 or 12 blocks
  73. per macroblock).
  74. The actual content depends on the encoding stage. Either prediction error
  75. (or intra block data), DCT transformed data, quantized DCT coefficients or
  76. inverse transformed data is stored in blocks. This is done to keep
  77. memory requirements reasonable.
  78. Encoding procedure
  79. The high-level structure of the bitstream is determined in putseq().
  80. This includes writing the appropriate headers and extensions and the
  81. decision which picture coding type to choose for each picture.
  82. Encoding of a picture is divided into the following steps:
  83. - motion estimation (motion_estimation())
  84. - calculate prediction (predict())
  85. - DCT type estimation (dct_type_estimation())
  86. - subtract prediction from picture and perform DCT (transform())
  87. - quantize DCT coefficients and generate VLC data (putpict())
  88. - inverse quantize DCT coefficients (iquant())
  89. - perform IDCT and add prediction (itransform())
  90. Each of these steps is performed for the complete picture before
  91. proceding to the next one. The intention is to keep these
  92. steps as independent from each other as possible. They communicate
  93. only via the above mentioned basic data structures. This should simplify
  94. experimenting with different coding models.
  95. Quantization and VLC generation could not be separated from each other,
  96. as quantization parameters and output buffer content usually form a
  97. closed loop on macroblock level.
  98. - Motion Estimation
  99. The procedures for motion estimation are in the file motion.c. The main
  100. function motion_estimation() loops through all macroblocks of the current
  101. picture calling frame_ME (for frame pictures) or field_ME (for field
  102. pictures) to calculate motion vectors for each macroblock.
  103. Motion estimation is currently done separately. More efficient schemes
  104. like telescopic motion estimation, which span several pictures (e.g.
  105. two I/P pictures and all intervening B pictures), are not yet implemented.
  106. Motion estimation splits into three steps:
  107. - calculation of optimum motion vectors for each of the possible motion
  108.   compensation types (frame, field, 16x8, dual prime)
  109. - selection of the best motion compensation type by calculating and comparing
  110.   a prediction error based cost function
  111. - selection of either motion compensation or any other possible encoding
  112.   type (intra coding, No MC coding)
  113. Motion vectors are estimated by integer pel full search in a search window
  114. of user defined size. This full search is based on the original source
  115. reference pictures. Subsequently the cost functions for the 9 motion vectors
  116. with an offset of -0.5, 0, and 0.5 relative to the best integer pel vectors
  117. are evaluated (using the reconstructed reference picture) and the vector with
  118. smallest cost function is used as estimation.
  119. To speed up full search, the cost function calculation is aborted if the
  120. intermediate values exceed the cost function value of an earlier motion
  121. vector in the same full search. This is most efficient if vectors of
  122. potentially low cost are evaluated fist. Therefore full search is organized in
  123. an outward spiral.