mbinterlace.cpp
上传用户:sun1608
上传日期:2007-02-02
资源大小:6116k
文件大小:7k
源码类别:

流媒体/Mpeg4/MP4

开发平台:

Visual C++

  1. /* 
  2.  * Copyright (c) 1997 NextLevel Systems of Delaware, Inc.  All rights reserved.
  3.  * 
  4.  * This software module  was developed by  Bob Eifrig (at NextLevel
  5.  * Systems of Delaware, Inc.), Xuemin Chen (at NextLevel Systems of
  6.  * Delaware, Inc.), and Ajay Luthra (at NextLevel Systems of Delaware,
  7.  * Inc.), in the course of development of the MPEG-4 Video Standard
  8.  * (ISO/IEC 14496-2).   This software module is an implementation of a
  9.  * part of one or more tools as specified by the MPEG-4 Video Standard.
  10.  * 
  11.  * NextLevel Systems of Delaware, Inc. grants the right, under its
  12.  * copyright in this software module, to use this software module and to
  13.  * make modifications to it for use in products which conform to the
  14.  * MPEG-4 Video Standard.  No license is granted for any use in
  15.  * connection with products which do not conform to the MPEG-4 Video
  16.  * Standard.
  17.  * 
  18.  * Those intending to use this software module are advised that such use
  19.  * may infringe existing and unissued patents.  Please note that in
  20.  * order to practice the MPEG-4 Video Standard, a license may be
  21.  * required to certain patents held by NextLevel Systems of Delaware,
  22.  * Inc., its parent or affiliates ("NextLevel").   The provision of this
  23.  * software module conveys no license, express or implied, under any
  24.  * patent rights of NextLevel or of any third party.  This software
  25.  * module is subject to change without notice.  NextLevel assumes no
  26.  * responsibility for any errors that may appear in this software
  27.  * module.  NEXTLEVEL DISCLAIMS ALL WARRANTIES, EXPRESS AND IMPLIED,
  28.  * INCLUDING, BUT NOT LIMITED TO ANY WARRANTY THAT COMPLIANCE WITH OR
  29.  * PRACTICE OF THE SPECIFICATIONS OR USE OF THIS SOFTWARE MODULE WILL
  30.  * NOT INFRINGE THE INTELLECTUAL PROPERTY RIGHTS OF NEXTLEVEL OR ANY
  31.  * THIRD PARTY, AND ANY IMPLIED WARRANTIES OF MERCHANTABILITY AND
  32.  * FITNESS FOR A PARTICULAR PURPOSE.
  33.  * 
  34.  * NextLevel retains the full right to use this software module for its
  35.  * own purposes, to assign or transfer this software module to others,
  36.  * to prevent others from using this software module in connection with
  37.  * products which do not conform to the MPEG-4 Video Standard, and to
  38.  * prevent others from infringing NextLevel's patents.
  39.  * 
  40.  * As an express condition of the above license grant, users are
  41.  * required to include this copyright notice in all copies or derivative
  42.  * works of this software module.
  43.  */
  44. /***********************************************************CommentBegin******
  45.  *
  46.  * -- FrameFieldDCTDecide -- Determine if field DCT is better & swizzle 
  47.  *
  48.  * Purpose :  
  49.  * Determine if the macroblock should be field DCT code and
  50.  * reorder luminancemacroblock lines if the macroblock is
  51.  * field-coded.
  52.  *
  53.  * Return values : 
  54.  * Int FieldDCT : 0 if frame DCT, 1 if field DCT 
  55.  *
  56.  * Written by X. Chen, NextLevel System, Inc.
  57.  *
  58.  ***********************************************************CommentEnd********/
  59. #include <stdio.h>
  60. #include <math.h>
  61. #include <stdlib.h>
  62. #include <iostream.h>
  63. #include "typeapi.h"
  64. #include "codehead.h"
  65. #include "global.hpp"
  66. #include "entropy/bitstrm.hpp"
  67. #include "entropy/entropy.hpp"
  68. #include "entropy/huffman.hpp"
  69. #include "mode.hpp"
  70. #include "vopses.hpp"
  71. #include "vopseenc.hpp"
  72. #ifdef __MFC_
  73. #ifdef _DEBUG
  74. #undef THIS_FILE
  75. static char BASED_CODE THIS_FILE[] = __FILE__;
  76. #endif
  77. #define new DEBUG_NEW    
  78. #endif // __MFC_
  79. Bool CVideoObjectEncoder::FrameFieldDCTDecideC(PixelC* ppxlcCurrMBY)
  80. {
  81.         static unsigned char shuffle[] = {
  82.              16, 0, 32, 16, 64, 32, 128, 64, 0, 128, 48, 0, 96, 48,
  83.              192, 96, 144, 192, 0, 144, 80, 0, 160, 80, 0, 160, 112, 0,
  84.              224, 112, 208, 224, 176, 208, 0, 176, };
  85. PixelC *pBlk0, *pBlk1;
  86. double dCov, dNCov;
  87. Int iS0=0;
  88. Int iS1=0;
  89. Int iSq0=0;
  90. Int iSq1=0;
  91. Int iS01=0;
  92.     PixelC tmp[MB_SIZE];
  93. pBlk0 = ppxlcCurrMBY;
  94. pBlk1 = ppxlcCurrMBY + MB_SIZE;
  95. for (Int j = 0; j < 8; j++) {
  96. for (Int i = 0; i < 16; i++) {
  97. iS0 += *pBlk0;
  98. iSq0 += (*pBlk0)*(*pBlk0);
  99. iS1 += *pBlk1;
  100. iSq1 += (*pBlk1)*(*pBlk1);
  101. iS01 += (*pBlk0)*(*pBlk1);
  102. pBlk0++;
  103. pBlk1++;
  104. }
  105. pBlk0 += MB_SIZE;
  106. pBlk1 += MB_SIZE;
  107. }
  108. dCov=(iSq0-(iS0*iS0)/128.0)*(iSq1-(iS1*iS1)/128.0);
  109. if(dCov>0.0) {
  110. dNCov=(iS01-(iS0*iS1)/128.0)/sqrt(dCov);
  111. if(dNCov>0.5)
  112. return(0);
  113. }
  114. /*
  115.  * Re-order luminance macroblock lines
  116.  */
  117.     for (size_t i = 0; i < sizeof(shuffle); i += 2)
  118.         memcpy(shuffle[i+1] ? m_ppxlcCurrMBY+shuffle[i+1] : tmp,
  119.                shuffle[i+0] ? m_ppxlcCurrMBY+shuffle[i+0] : tmp,
  120.                MB_SIZE * sizeof(PixelC));
  121. return(1);
  122. }
  123. /***********************************************************CommentBegin******
  124.  *
  125.  * -- fieldDCTtoFrame -- permute the field DCT block back to frame layout 
  126.  *
  127.  *
  128.  ***********************************************************CommentEnd********/
  129. Void
  130. CVideoObjectEncoder::fieldDCTtoFrameC(PixelC* ppxlcCurrQMBY)
  131. {
  132. static unsigned char inv_shuffle[] = {
  133.         1, 0, 8, 1, 4, 8, 2, 4, 0, 2, 3, 0, 9, 3,
  134.         12, 9, 6, 12, 0, 6, 5, 0, 10, 5, 0, 10, 7, 0,
  135.         11, 7, 13, 11, 14, 13, 0, 14, };
  136.         PixelC tmp[MB_SIZE];
  137.         size_t i;
  138. for (i = 0; i < sizeof(inv_shuffle); i += 2)
  139.         memcpy(inv_shuffle[i+1] ? ppxlcCurrQMBY+inv_shuffle[i+1]*m_iFrameWidthY : tmp,
  140.                inv_shuffle[i+0] ? ppxlcCurrQMBY+inv_shuffle[i+0]*m_iFrameWidthY : tmp,
  141.                MB_SIZE*sizeof(PixelC));
  142. }
  143. Bool CVideoObjectEncoder::FrameFieldDCTDecideI(PixelI* ppxliErrorMBY)
  144. {
  145.     static unsigned char shuffle[] = {
  146.              16, 0, 32, 16, 64, 32, 128, 64, 0, 128, 48, 0, 96, 48,
  147.              192, 96, 144, 192, 0, 144, 80, 0, 160, 80, 0, 160, 112, 0,
  148.              224, 112, 208, 224, 176, 208, 0, 176, };
  149. PixelI *pBlk0, *pBlk1;
  150. double dCov, dNCov;
  151. Int iS0=0;
  152. Int iS1=0;
  153. Int iSq0=0;
  154. Int iSq1=0;
  155. Int iS01=0;
  156. size_t i;
  157.     Int tmp[MB_SIZE];
  158. pBlk0 = ppxliErrorMBY;
  159. pBlk1 = ppxliErrorMBY + MB_SIZE;
  160. for (Int j = 0; j < 8; j++) {
  161. for (i = 0; i < 16; i++) {
  162. iS0 += *pBlk0;
  163. iSq0 += (*pBlk0)*(*pBlk0);
  164. iS1 += *pBlk1;
  165. iSq1 += (*pBlk1)*(*pBlk1);
  166. iS01 += (*pBlk0)*(*pBlk1);
  167. pBlk0++;
  168. pBlk1++;
  169. }
  170. pBlk0 += MB_SIZE;
  171. pBlk1 += MB_SIZE;
  172. }
  173. dCov=(iSq0-(iS0*iS0)/128.0)*(iSq1-(iS1*iS1)/128.0);
  174. if(dCov>0.0) {
  175. dNCov=(iS01-(iS0*iS1)/128.0)/sqrt(dCov);
  176. if(dNCov>0.5)
  177. return(0);
  178. }
  179. /*
  180.  * Re-order luminance macroblock lines
  181.  */
  182.     for (i = 0; i < sizeof(shuffle); i += 2)
  183.         memcpy(shuffle[i+1] ? ppxliErrorMBY+shuffle[i+1] : tmp,
  184.                shuffle[i+0] ? ppxliErrorMBY+shuffle[i+0] : tmp,
  185.                MB_SIZE * sizeof(PixelI));
  186. return(1);
  187. }
  188. /***********************************************************CommentBegin******
  189.  *
  190.  * -- fieldDCTtoFrame -- permute the field DCT block back to frame layout 
  191.  *
  192.  *
  193.  ***********************************************************CommentEnd********/
  194. Void
  195. CVideoObjectEncoder::fieldDCTtoFrameI(PixelI* ppxliErrorMBY)
  196. {
  197. static unsigned char inv_shuffle[] = {
  198.         16, 0, 128, 16, 64, 128, 32, 64, 0, 32, 48, 0, 144, 48,
  199.         192, 144, 96, 192, 0, 96, 80, 0, 160, 80, 0, 160, 112, 0,
  200.         176, 112, 208, 176, 224, 208, 0, 224,
  201.                 };
  202.     Int tmp[MB_SIZE];
  203.     size_t i;
  204. for (i = 0; i < sizeof(inv_shuffle); i += 2)
  205.         memcpy(inv_shuffle[i+1] ? ppxliErrorMBY+inv_shuffle[i+1] : tmp,
  206.                inv_shuffle[i+0] ? ppxliErrorMBY+inv_shuffle[i+0] : tmp,
  207.                MB_SIZE*sizeof(PixelI));
  208. }