⭐ 欢迎来到虫虫下载站! | 📦 资源下载 📁 资源专辑 ℹ️ 关于我们
⭐ 虫虫下载站

📄 jdmainct.c

📁 基于Linux的ffmepg decoder
💻 C
📖 第 1 页 / 共 2 页
字号:
  *out_row_ctr+= (cinfo->max_v_samp_factor << 3)*cinfo->total_iMCU_rows; // to signal the caller function to exit its loop  #else  my_main_ptr main = (my_main_ptr) cinfo->main;  while (main->iMCU_row_ctr < cinfo->total_iMCU_rows) {	    *out_row_ctr+= cinfo->max_v_samp_factor << 3;    if (! (*cinfo->coef->decompress_data) (cinfo,NULL)) //decompress_onepass()      return;		// suspension forced, can do nothing more    main->iMCU_row_ctr++;  }  #endif/*  // Read input data if we haven't filled the main buffer yet   if (! main->buffer_full) {    if (! (*cinfo->coef->decompress_data) (cinfo, main->buffer))      return;			// suspension forced, can do nothing more     main->buffer_full = TRUE;	// OK, we have an iMCU row to work with   }  // There are always min_DCT_scaled_size row groups in an iMCU row.   rowgroups_avail = (JDIMENSION) cinfo->min_DCT_scaled_size;  // Note: at the bottom of the image, we may pass extra garbage row groups  // to the postprocessor.  The postprocessor has to check for bottom  // of image anyway (at row resolution), so no point in us doing it too.  //  // Feed the postprocessor   (*cinfo->post->post_process_data) (cinfo, main->buffer,				     &main->rowgroup_ctr, rowgroups_avail,				     output_buf, out_row_ctr, out_rows_avail);  // Has postprocessor consumed all the data yet? If so, mark buffer empty   if (main->rowgroup_ctr >= rowgroups_avail) {    main->buffer_full = FALSE;    main->rowgroup_ctr = 0;  }*/}/* * Process some data. * This handles the case where context rows must be provided. */METHODDEF(void)process_data_context_main (j_decompress_ptr cinfo,			   JSAMPARRAY output_buf, JDIMENSION *out_row_ctr,			   JDIMENSION out_rows_avail){  #ifdef USE_INTERNAL_CPU  (*cinfo->coef->decompress_data) (cinfo,NULL); //decompress_onepass()  *out_row_ctr+= (cinfo->max_v_samp_factor << 3)*cinfo->total_iMCU_rows; // to signal the caller function to exit its loop    #else  my_main_ptr main = (my_main_ptr) cinfo->main;  while (main->iMCU_row_ctr < cinfo->total_iMCU_rows) {	    *out_row_ctr+= cinfo->max_v_samp_factor << 3;    if (! (*cinfo->coef->decompress_data) (cinfo,NULL)) //decompress_onepass()      return;		/* suspension forced, can do nothing more */        main->iMCU_row_ctr++;  }  #endif/*  // Read input data if we haven't filled the main buffer yet  if (! main->buffer_full) {    if (! (*cinfo->coef->decompress_data) (cinfo,					   main->xbuffer[main->whichptr]))					//pwhsu:20031031																		//decompress_onepass()      return;			// suspension forced, can do nothing more     main->buffer_full = TRUE;	// OK, we have an iMCU row to work with     main->iMCU_row_ctr++;	// count rows received   }  // Postprocessor typically will not swallow all the input data it is handed  // in one call (due to filling the output buffer first).  Must be prepared  // to exit and restart.  This switch lets us keep track of how far we got.  // Note that each case falls through to the next on successful completion.  //  switch (main->context_state) {  case CTX_POSTPONED_ROW:    // Call postprocessor using previously set pointers for postponed row     (*cinfo->post->post_process_data) (cinfo, main->xbuffer[main->whichptr],			&main->rowgroup_ctr, main->rowgroups_avail,			output_buf, out_row_ctr, out_rows_avail);    if (main->rowgroup_ctr < main->rowgroups_avail)      return;			// Need to suspend     main->context_state = CTX_PREPARE_FOR_IMCU;    if (*out_row_ctr >= out_rows_avail)      return;			// Postprocessor exactly filled output buf     //FALLTHROUGH  case CTX_PREPARE_FOR_IMCU:    // Prepare to process first M-1 row groups of this iMCU row     main->rowgroup_ctr = 0;    main->rowgroups_avail = (JDIMENSION) (cinfo->min_DCT_scaled_size - 1);    // Check for bottom of image: if so, tweak pointers to "duplicate"    // the last sample row, and adjust rowgroups_avail to ignore padding rows.    //    if (main->iMCU_row_ctr == cinfo->total_iMCU_rows)      set_bottom_pointers(cinfo);    main->context_state = CTX_PROCESS_IMCU;    //FALLTHROUGH  case CTX_PROCESS_IMCU:    // Call postprocessor using previously set pointers    (*cinfo->post->post_process_data) (cinfo, main->xbuffer[main->whichptr],			&main->rowgroup_ctr, main->rowgroups_avail,			output_buf, out_row_ctr, out_rows_avail);    if (main->rowgroup_ctr < main->rowgroups_avail)      return;			// Need to suspend     // After the first iMCU, change wraparound pointers to normal state     if (main->iMCU_row_ctr == 1)      set_wraparound_pointers(cinfo);    // Prepare to load new iMCU row using other xbuffer list    main->whichptr ^= 1;	// 0=>1 or 1=>0     main->buffer_full = FALSE;    // Still need to process last row group of this iMCU row,     // which is saved at index M+1 of the other xbuffer     main->rowgroup_ctr = (JDIMENSION) (cinfo->min_DCT_scaled_size + 1);    main->rowgroups_avail = (JDIMENSION) (cinfo->min_DCT_scaled_size + 2);    main->context_state = CTX_POSTPONED_ROW;  }*/}/* * Process some data. * Final pass of two-pass quantization: just call the postprocessor. * Source data will be the postprocessor controller's internal buffer. */#ifdef QUANT_2PASS_SUPPORTEDMETHODDEF(void)process_data_crank_post (j_decompress_ptr cinfo,			 JSAMPARRAY output_buf, JDIMENSION *out_row_ctr,			 JDIMENSION out_rows_avail){  (*cinfo->post->post_process_data) (cinfo, (JSAMPIMAGE) NULL,				     (JDIMENSION *) NULL, (JDIMENSION) 0,				     output_buf, out_row_ctr, out_rows_avail);}#endif /* QUANT_2PASS_SUPPORTED *//* * Initialize main buffer controller. */GLOBAL(void)jinit_d_main_controller (j_decompress_ptr cinfo, boolean need_full_buffer){  my_main_ptr main;  int ci, rgroup, ngroups;  jpeg_component_info *compptr;  main = (my_main_ptr)    (*cinfo->mem->alloc_small) ((j_common_ptr) cinfo, JPOOL_IMAGE,				SIZEOF(my_main_controller));  cinfo->main = (struct jpeg_d_main_controller *) main;  main->pub.start_pass = start_pass_main;  if (need_full_buffer)		/* shouldn't happen */    ERREXIT(cinfo, JERR_BAD_BUFFER_MODE);  /* Allocate the workspace.   * ngroups is the number of row groups we need.   */  if (cinfo->upsample->need_context_rows) {    if (cinfo->min_DCT_scaled_size < 2) /* unsupported, see comments above */      ERREXIT(cinfo, JERR_NOTIMPL);    alloc_funny_pointers(cinfo); /* Alloc space for xbuffer[] lists */    ngroups = cinfo->min_DCT_scaled_size + 2;  } else {    ngroups = cinfo->min_DCT_scaled_size;  }  for (ci = 0, compptr = cinfo->comp_info; ci < cinfo->num_components;       ci++, compptr++) {    rgroup = (compptr->v_samp_factor * compptr->DCT_scaled_size) /      cinfo->min_DCT_scaled_size; /* height of a row group of component */    main->buffer[ci] = (*cinfo->mem->alloc_sarray)			((j_common_ptr) cinfo, JPOOL_IMAGE,			 compptr->width_in_blocks * compptr->DCT_scaled_size,			 (JDIMENSION) (rgroup * ngroups));  }}GLOBAL(void) generate_dma_chain_table (j_decompress_ptr cinfo,unsigned int MCU_col_num,int buf_descriptor){  my_main_ptr main = (my_main_ptr) cinfo->main;  FTMCP100_CODEC *pCodec=(FTMCP100_CODEC *)cinfo->pCodec;  int xp;  // the x axis's position in char length within each component's output buffer  int yp;  // the y axis's position in char length within each component's output buffer   int ci;  // the component index which is merely used for counter purpose  int xi; // the x (horizontal) block index within each MCU and is merely used for counter purpose  int yi; // the y (vertical) block index within each MCU and is merely used for counter purpose  jpeg_component_info *compptr;  // the component's pointer  unsigned char *p; // the pointer to the beginning of each component's output buffer  unsigned char *mp; // beginning of each MCU's pointer  unsigned char *s; // the final system address    int n = buf_descriptor*40; // the index for pLDMA array  int width;  #if (defined(CORE_VERSION_2) && defined(USING_AUTO_INCREMNET))  // because of ping-pong buffer, we just set the auto-increment  // mechanism for MCU 0 & 1  if(MCU_col_num==0 || MCU_col_num==1)    {      for (ci = 0; ci < cinfo->comps_in_scan; ci++)        {          compptr=cinfo->cur_comp_info[ci];          p=pCodec->outdata[compptr->component_index];          width=compptr->MCU_width*cinfo->MCUs_per_row*DCTSIZE;	      xp=MCU_col_num * compptr->MCU_sample_width; // x axis position          //yp=(main->iMCU_row_ctr*(compptr->v_samp_factor*DCTSIZE))*(compptr->MCU_sample_width*compptr->MCU_width);          yp=main->iMCU_row_ctr*compptr->MCU_height*DCTSIZE; // y axis position          mp=p+(yp*width+xp);                      for(yi=0;yi<compptr->MCU_height;yi++)            {  	          for(xi=0;xi<compptr->MCU_width;xi++,n+=4)                {                  // the auto-increment size is about 2*(compptr->MCU_width*DCTSIZE) for                  // each System Memory Base Register in DMA ping-pong buffer.                  // And becasue by JPEG standard, the available horizontal and vertical                  // sampling factor can be only 1,2,3 or 4. So the increment size for                  // bit 0~2 in System Memory Base Register can be 16,32,48 and 64 bytes                  // repsectively , which is corresponding to the hardware register setting                  // 1,2,3,4.                  // So, you can set the 'Increment Index' field of System Memory Base Address                  // Register to the 'compptr->MCU_width' directly which is corresponding to the                  // horizontal sampling factor.                                    s=mp+((yi*width+xi)*DCTSIZE);			      pCodec->pLDMA[n] = (unsigned int) s | (compptr->MCU_width);                } // end of xi            } // end of yi        } // end of ci    }      #else    for (ci = 0; ci < cinfo->comps_in_scan; ci++)    {      compptr=cinfo->cur_comp_info[ci];	  p=pCodec->outdata[compptr->component_index];      width=compptr->MCU_width*cinfo->MCUs_per_row*DCTSIZE;	  xp=MCU_col_num * compptr->MCU_sample_width; // x axis position      //yp=(main->iMCU_row_ctr*(compptr->v_samp_factor*DCTSIZE))*(compptr->MCU_sample_width*compptr->MCU_width);      yp=main->iMCU_row_ctr*compptr->MCU_height*DCTSIZE; // y axis position      mp=p+(yp*width+xp);            	  for(yi=0;yi<compptr->MCU_height;yi++)        {  	      for(xi=0;xi<compptr->MCU_width;xi++,n+=4)            {              s=mp+((yi*width+xi)*DCTSIZE);			  pCodec->pLDMA[n] = (unsigned int) s;			} // end of xi		} // end of yi	} // end of ci  #endif}GLOBAL(void) generate_dma_noninterleaved_chain_table (j_decompress_ptr cinfo,unsigned int MCU_col_num,unsigned int MCU_row_num,int buf_descriptor){  //my_main_ptr main = (my_main_ptr) cinfo->main;  FTMCP100_CODEC *pCodec=(FTMCP100_CODEC *)cinfo->pCodec;  int xp;  // the x axis's position in char length within each component's output buffer  int yp;  // the y axis's position in char length within each component's output buffer   int ci;  // the component index which is merely used for counter purpose  int xi; // the x (horizontal) block index within each MCU and is merely used for counter purpose  int yi; // the y (vertical) block index within each MCU and is merely used for counter purpose  jpeg_component_info *compptr;  // the component's pointer  unsigned char *p; // the pointer to the beginning of each component's output buffer  unsigned char *mp; // beginning of each MCU's pointer  unsigned char *s; // the final system address    int n = buf_descriptor*40; // the index for pLDMA array  int width;  #if (defined(CORE_VERSION_2) && defined(USING_AUTO_INCREMNET))  // because of ping-pong buffer, we just set the auto-increment  // mechanism for MCU 0 & 1  if(MCU_col_num==0 || MCU_col_num==1)    {      for (ci = 0; ci < cinfo->comps_in_scan; ci++)        {          compptr=cinfo->cur_comp_info[ci];          p=pCodec->outdata[compptr->component_index];                    width=compptr->MCU_width*cinfo->MCUs_per_row*DCTSIZE;	      xp=MCU_col_num * compptr->MCU_sample_width; // x axis position          //yp=(main->iMCU_row_ctr*(compptr->v_samp_factor*DCTSIZE))*(compptr->MCU_sample_width*compptr->MCU_width);          //yp=main->iMCU_row_ctr*compptr->MCU_height*DCTSIZE; // y axis position          yp=MCU_row_num*compptr->MCU_height*DCTSIZE; // y axis position          mp=p+(yp*width+xp);            	      for(yi=0;yi<compptr->MCU_height;yi++)            {  	          for(xi=0;xi<compptr->MCU_width;xi++,n+=4)                {                  // the auto-increment size is about 2*(compptr->MCU_width*DCTSIZE) for                  // each System Memory Base Register in DMA ping-pong buffer.                  // And becasue by JPEG standard, the available horizontal and vertical                  // sampling factor can be only 1,2,3 or 4. So the increment size for                  // bit 0~2 in System Memory Base Register can be 16,32,48 and 64 bytes                  // repsectively , which is corresponding to the hardware register setting                  // 1,2,3,4.                  // So, you can set the 'Increment Index' field of System Memory Base Address                  // Register to the 'compptr->MCU_width' directly which is corresponding to the                  // horizontal sampling factor.                  s=mp+((yi*width+xi)*DCTSIZE);			      pCodec->pLDMA[n] = (unsigned int) s | (compptr->MCU_width);                } // end of xi            } // end of yi        } // end of ci    }  #else    for (ci = 0; ci < cinfo->comps_in_scan; ci++)      {        compptr=cinfo->cur_comp_info[ci];        p=pCodec->outdata[compptr->component_index];        width=compptr->MCU_width*cinfo->MCUs_per_row*DCTSIZE;	    xp=MCU_col_num * compptr->MCU_sample_width; // x axis position        //yp=(main->iMCU_row_ctr*(compptr->v_samp_factor*DCTSIZE))*(compptr->MCU_sample_width*compptr->MCU_width);        //yp=main->iMCU_row_ctr*compptr->MCU_height*DCTSIZE; // y axis position        yp=MCU_row_num*compptr->MCU_height*DCTSIZE; // y axis position        mp=p+(yp*width+xp);            	    for(yi=0;yi<compptr->MCU_height;yi++)          {  	        for(xi=0;xi<compptr->MCU_width;xi++,n+=4)              {                s=mp+((yi*width+xi)*DCTSIZE);			    pCodec->pLDMA[n] = (unsigned int) s;              } // end of xi          } // end of yi      } // end of ci  #endif}

⌨️ 快捷键说明

复制代码 Ctrl + C
搜索代码 Ctrl + F
全屏模式 F11
切换主题 Ctrl + Shift + D
显示快捷键 ?
增大字号 Ctrl + =
减小字号 Ctrl + -