Codec.cpp
上传用户:lusi_8715
上传日期:2007-01-08
资源大小:199k
文件大小:6k
源码类别:

流媒体/Mpeg4/MP4

开发平台:

Visual C++

  1. /**************************************************************************************
  2.  *                                                                                    *
  3.  * This application contains code from OpenDivX and is released as a "Larger Work"    *
  4.  * under that license. Consistant with that license, this application is released     *
  5.  * under the GNU General Public License.                                              *
  6.  *                                                                                    *
  7.  * The OpenDivX license can be found at: http://www.projectmayo.com/opendivx/docs.php *
  8.  * The GPL can be found at: http://www.gnu.org/copyleft/gpl.html                      *
  9.  *                                                                                    *
  10.  * Copyright (c) 2001 - Project Mayo                                                  *
  11.  *                                                                                    *
  12.  * Authors: Damien Chavarria <adrc at projectmayo.com>                                *
  13.  *                                                                                    *
  14.  **************************************************************************************/
  15. #include "Codec.h"
  16. /*
  17.  * Functions
  18.  *
  19.  */
  20. /*
  21.  * Constructor : tries to open the stream
  22.  *
  23.  */
  24. Codec::Codec(BITMAPINFOHEADER *bih)
  25. {
  26. HRESULT h;
  27. this->hic       = 0;
  28. this->divx      = 0;
  29. this->videoMode = VIDEO_MODE_ERROR;
  30. if(bih) {
  31. if(bih->biCompression == 4) {
  32.     bih->biCompression = mmioFOURCC('D', 'I', 'V', 'X');
  33. }
  34. if(bih->biCompression == mmioFOURCC('D', 'I', 'V', 'X')) {
  35. /*
  36.  * Here we can use decore directly
  37.  */
  38. this->dec_param.x_dim = bih->biWidth;
  39. this->dec_param.y_dim = bih->biHeight;
  40. this->dec_param.color_depth = 24;
  41. this->videoMode = VIDEO_MODE_RGB24;
  42. decore(0x8001, DEC_OPT_INIT, &this->dec_param, NULL);
  43. /*
  44.  * We set the use of prosprocessing or not
  45.  */
  46. this->dec_set.postproc_level = 0;
  47. decore(0x8001, DEC_OPT_SETPP, &dec_set, NULL);
  48. this->divx = 1;
  49. }
  50. else {
  51. this->hic = ICOpen(mmioFOURCC('V', 'I', 'D', 'C'), 
  52.              bih->biCompression,
  53.              ICMODE_FASTDECOMPRESS);
  54. if(this->hic != 0) {
  55. ZeroMemory(&this->in_bih, sizeof(BITMAPINFO));
  56. ZeroMemory(&this->out_bih, sizeof(BITMAPINFO));
  57.     memcpy(&this->in_bih.bmiHeader, bih, sizeof(BITMAPINFOHEADER));
  58. out_bih.bmiHeader.biSize     = sizeof(BITMAPINFOHEADER);
  59. out_bih.bmiHeader.biBitCount = 16;
  60. h = ICDecompressGetFormat( this->hic, &this->in_bih, &this->out_bih ); 
  61. if(h == ICERR_OK) {
  62. h = ICDecompressQuery(this->hic, &this->in_bih, &this->out_bih);
  63.     
  64. this->out_bih.bmiHeader.biSizeImage = out_bih.bmiHeader.biWidth*out_bih.bmiHeader.biHeight*out_bih.bmiHeader.biBitCount/8;
  65. h = ICDecompressBegin(this->hic, &this->in_bih, &this->out_bih);  
  66. this->videoMode = VIDEO_MODE_RGB24;
  67. if(h != ICERR_OK) {
  68. MessageBox(NULL, "Can't Begin Decompression", "", MB_OK);
  69. this->hic = 0;
  70. }
  71. }
  72. else {
  73. MessageBox(NULL, "Codec not working!", "", MB_OK);
  74. this->hic = 0;
  75. }
  76. }
  77. else {
  78. MessageBox(NULL, "Can't find any appropriate Codec!", "", MB_OK);
  79. this->hic = 0;
  80. }
  81. }
  82. }
  83. else {
  84. MessageBox(NULL, "Codec : wrong input parameters!", "Error", MB_OK);
  85. }
  86. }
  87. /* 
  88.  * Destructor : Cleanup.
  89.  *
  90.  */
  91. Codec::~Codec()
  92. {
  93. }
  94. /*
  95.  * Returns TRUE if codec is
  96.  * ready to decode data.
  97.  */
  98. int Codec::IsOK()
  99. {
  100. return (this->hic != 0 || this->divx != 0);
  101. }
  102. /*
  103.  * Set/Get the video Mode
  104.  */
  105. int Codec::GetVideoMode() {
  106. return this->videoMode;
  107. }
  108. int Codec::SetVideoMode(int depth) {
  109. if(this->divx) {
  110. switch(depth) {
  111. case VIDEO_MODE_RGB16:
  112. this->dec_param.color_depth = 16;
  113. this->videoMode = VIDEO_MODE_RGB16;
  114. decore(0x8001, DEC_OPT_INIT, &this->dec_param, NULL);
  115. break;
  116. case VIDEO_MODE_RGB24:
  117. this->dec_param.color_depth = 24;
  118. this->videoMode = VIDEO_MODE_RGB24;
  119. decore(0x8001, DEC_OPT_INIT, &this->dec_param, NULL);
  120. break;
  121. case VIDEO_MODE_RGB32:
  122. this->dec_param.color_depth = 32;
  123. this->videoMode = VIDEO_MODE_RGB32;
  124. decore(0x8001, DEC_OPT_INIT, &this->dec_param, NULL);
  125. break;
  126. default:
  127. return 0;
  128. break;
  129. }
  130. }
  131. else {
  132. if(this->hic) {
  133. }
  134. }
  135. return 0;
  136. }
  137. /*
  138.  * Decompress on frame
  139.  *
  140.  */
  141. int Codec::Decompress(char *in, long in_size, char *out)
  142. {
  143. HRESULT h;
  144. if(this->divx) {
  145. dec_frame.length      = in_size;
  146. dec_frame.bitstream   = in;
  147. dec_frame.bmp         = out;
  148. dec_frame.render_flag = 1;
  149.   
  150.     decore(0x8001, 0, &dec_frame, NULL);
  151. }
  152. else {
  153. if(this->hic) {
  154. this->in_bih.bmiHeader.biSizeImage = in_size;
  155. if(in_size == 0) {
  156. h = ICDecompress(this->hic, ICDECOMPRESS_NULLFRAME,
  157.  &this->in_bih.bmiHeader, (void *) in,
  158.  &this->out_bih.bmiHeader, (void *) out);
  159. }
  160. else {
  161. h = ICDecompress(this->hic, ICDECOMPRESS_NOTKEYFRAME,
  162.  &this->in_bih.bmiHeader, (void *) in,
  163.  &this->out_bih.bmiHeader, (void *) out);
  164. }
  165. }
  166. }
  167. return 1;
  168. }
  169. /*
  170.  * Drops one frame.
  171.  *
  172.  */
  173. int Codec::Drop(char *in, long in_size, char *out) 
  174. {
  175. if(this->divx) {
  176. dec_frame.length      = in_size;
  177. dec_frame.bitstream   = in;
  178. dec_frame.bmp         = out;
  179. dec_frame.render_flag = 0;
  180.   
  181.     decore(0x8001, 0, &dec_frame, NULL);
  182. }
  183. else {
  184. if(this->hic) {
  185. this->in_bih.bmiHeader.biSizeImage = in_size;
  186. ICDecompress(this->hic, ICDECOMPRESS_HURRYUP,
  187.  &this->in_bih.bmiHeader, (void *) in,
  188.  &this->out_bih.bmiHeader, (void *) out);
  189. }
  190. }
  191. return 1;
  192. }
  193. /*
  194.  * return a name for the
  195.  * codec in use...
  196.  *
  197.  */
  198. char *Codec::GetCodecName()
  199. {
  200. if(this->divx) {
  201. return "OpenDivX video codec";
  202. }
  203. else {
  204. if(this->hic) {
  205. ICINFO icInfo;
  206. char *name;
  207. int i;
  208. ICGetInfo(this->hic, &icInfo, sizeof(ICINFO));
  209. name = (char *) malloc(128);
  210. for(i=0; i < 128; i++) { 
  211. name[i] = icInfo.szDescription[i] & 255;
  212. }
  213. return name;
  214. }
  215. }
  216. return NULL;
  217. }
  218. /*
  219.  * Closes the decoder.
  220.  *
  221.  */
  222. int Codec::Close()
  223. {
  224. if(this->divx) {
  225. decore(0x8001, DEC_OPT_RELEASE, NULL, NULL);
  226. }
  227. else {
  228. if(this->hic) {
  229. ICDecompressEnd(this->hic);
  230. ICClose(this->hic);
  231. }
  232. }
  233. return 1;
  234. }