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

📄 image.c

📁 网络MPEG4IP流媒体开发源代码
💻 C
📖 第 1 页 / 共 3 页
字号:
    img->tr=img->number*(input->jumpd+1);#ifdef _ADAPT_LAST_GROUP_    if (input->last_frame && img->number+1 == input->no_frames)      img->tr=input->last_frame;#endif    if(img->number!=0 && input->successive_Bframe != 0)   // B pictures to encode      nextP_tr=img->tr;    if (img->type == INTRA_IMG)      img->qp = input->qp0;         // set quant. parameter for I-frame    else    {#ifdef _CHANGE_QP_        if (input->qp2start > 0 && img->tr >= input->qp2start)          img->qp = input->qpN2;        else#endif          img->qp = input->qpN;      if (img->types==SP_IMG)      {        img->qp = input->qpsp;        img->qpsp = input->qpsp_pred;      }    }    img->mb_y_intra=img->mb_y_upd;   //  img->mb_y_intra indicates which GOB to intra code for this frame    if (input->intra_upd > 0)          // if error robustness, find next GOB to update    {      img->mb_y_upd=(img->number/input->intra_upd) % (img->height/MB_BLOCK_SIZE);    }  }  else  {    img->p_interval = input->jumpd+1;    prevP_no = (img->number-1)*img->p_interval;    nextP_no = img->number*img->p_interval;#ifdef _ADAPT_LAST_GROUP_    last_P_no[0] = prevP_no; for (i=1; i<img->buf_cycle; i++) last_P_no[i] = last_P_no[i-1]-img->p_interval;    if (input->last_frame && img->number+1 == input->no_frames)      {        nextP_no        =input->last_frame;        img->p_interval =nextP_no - prevP_no;      }#endif    img->b_interval = (int)((float)(input->jumpd+1)/(input->successive_Bframe+1.0)+0.49999);    img->tr= prevP_no+img->b_interval*img->b_frame_to_code; // from prev_P    if(img->tr >= nextP_no)      img->tr=nextP_no-1; // ?????#ifdef _CHANGE_QP_    if (input->qp2start > 0 && img->tr >= input->qp2start)      img->qp = input->qpB2;    else#endif      img->qp = input->qpB;    // initialize arrays    for(k=0; k<2; k++)      for(i=0; i<img->height/BLOCK_SIZE; i++)        for(j=0; j<img->width/BLOCK_SIZE+4; j++)        {          tmp_fwMV[k][i][j]=0;          tmp_bwMV[k][i][j]=0;          dfMV[k][i][j]=0;          dbMV[k][i][j]=0;        }    for(i=0; i<img->height/BLOCK_SIZE; i++)      for(j=0; j<img->width/BLOCK_SIZE; j++)      {        fw_refFrArr[i][j]=bw_refFrArr[i][j]=-1;      }  }}/*! ************************************************************************ * \brief *    Initializes the parameters for a new slice ************************************************************************ */void init_slice(){  int i;  Slice *curr_slice = img->currentSlice;  DataPartition *dataPart;  Bitstream *currStream;  curr_slice->picture_id = img->tr%256;  curr_slice->slice_nr = img->current_slice_nr;  curr_slice->qp = img->qp;  curr_slice->start_mb_nr = img->current_mb_nr;  curr_slice->dp_mode = input->partition_mode;  curr_slice->slice_too_big = dummy_slice_too_big;  for (i=0; i<curr_slice->max_part_nr; i++)  {    dataPart = &(curr_slice->partArr[i]);    // in priciple it is possible to assign to each partition    // a different entropy coding method    if (input->symbol_mode == UVLC)      dataPart->writeSyntaxElement = writeSyntaxElement_UVLC;    else      dataPart->writeSyntaxElement = writeSyntaxElement_CABAC;    // A little hack until CABAC can handle non-byte aligned start positions   StW!    // For UVLC, the stored_ positions in the bit buffer are necessary.  For CABAC,    // the buffer is initialized to start at zero.    if (input->symbol_mode == UVLC && input->of_mode == PAR_OF_26L)    // Stw: added PAR_OF_26L check    {      currStream = dataPart->bitstream;      currStream->bits_to_go  = currStream->stored_bits_to_go;      currStream->byte_pos    = currStream->stored_byte_pos;      currStream->byte_buf    = currStream->stored_byte_buf;    }     else // anything but UVLC and PAR_OF_26L    {         currStream = dataPart->bitstream;      currStream->bits_to_go  = 8;      currStream->byte_pos    = 0;      currStream->byte_buf    = 0;    }  }}/*! ************************************************************************ * \brief *    Reads new frame from file and sets frame_no ************************************************************************ */void read_one_new_frame(){  int i, j, uv;  int status; // frame_no;  int frame_size = img->height*img->width*3/2;  if(img->type == B_IMG)    frame_no = (img->number-1)*(input->jumpd+1)+img->b_interval*img->b_frame_to_code;  else  {    frame_no = img->number*(input->jumpd+1);#ifdef _ADAPT_LAST_GROUP_      if (input->last_frame && img->number+1 == input->no_frames)        frame_no=input->last_frame;#endif  }  rewind (p_in);  status  = fseek (p_in, frame_no * frame_size + input->infile_header, 0);  if (status != 0)  {    snprintf(errortext, ET_SIZE, "Error in seeking frame no: %d\n", frame_no);    error(errortext,1);  }  for (j=0; j < img->height; j++)    for (i=0; i < img->width; i++)      imgY_org[j][i]=fgetc(p_in);  for (uv=0; uv < 2; uv++)    for (j=0; j < img->height_cr ; j++)      for (i=0; i < img->width_cr; i++)        imgUV_org[uv][j][i]=fgetc(p_in);}/*! ************************************************************************ * \brief *     Writes reconstructed image(s) to file *     This can be done more elegant! ************************************************************************ */void write_reconstructed_image(){  int i, j, k;  if (p_dec != NULL)  {    if(img->type != B_IMG)    {      // write reconstructed image (IPPP)      if(input->successive_Bframe==0)      {        for (i=0; i < img->height; i++)          for (j=0; j < img->width; j++)            fputc(min(imgY[i][j],255),p_dec);        for (k=0; k < 2; ++k)          for (i=0; i < img->height/2; i++)            for (j=0; j < img->width/2; j++)              fputc(min(imgUV[k][i][j],255),p_dec);      }      // write reconstructed image (IBPBP) : only intra written      else if (img->number==0 && input->successive_Bframe!=0)      {        for (i=0; i < img->height; i++)          for (j=0; j < img->width; j++)            fputc(min(imgY[i][j],255),p_dec);        for (k=0; k < 2; ++k)          for (i=0; i < img->height/2; i++)            for (j=0; j < img->width/2; j++)              fputc(min(imgUV[k][i][j],255),p_dec);      }      // next P picture. This is saved with recon B picture after B picture coding      if (img->number!=0 && input->successive_Bframe!=0)      {        for (i=0; i < img->height; i++)          for (j=0; j < img->width; j++)            nextP_imgY[i][j]=imgY[i][j];        for (k=0; k < 2; ++k)          for (i=0; i < img->height/2; i++)            for (j=0; j < img->width/2; j++)              nextP_imgUV[k][i][j]=imgUV[k][i][j];      }    }    else    {      for (i=0; i < img->height; i++)        for (j=0; j < img->width; j++)          fputc(min(imgY[i][j],255),p_dec);      for (k=0; k < 2; ++k)        for (i=0; i < img->height/2; i++)          for (j=0; j < img->width/2; j++)            fputc(min(imgUV[k][i][j],255),p_dec);      // If this is last B frame also store P frame      if(img->b_frame_to_code == input->successive_Bframe)      {        // save P picture        for (i=0; i < img->height; i++)          for (j=0; j < img->width; j++)            fputc(min(nextP_imgY[i][j],255),p_dec);        for (k=0; k < 2; ++k)          for (i=0; i < img->height/2; i++)            for (j=0; j < img->width/2; j++)              fputc(min(nextP_imgUV[k][i][j],255),p_dec);      }    }  }}/*! ************************************************************************ * \brief *    Choose interpolation method depending on MV-resolution ************************************************************************ */void interpolate_frame(){                 // write to mref[]  int rpic;  rpic = img->frame_cycle = img->number % img->buf_cycle;  if(input->mv_res)    oneeighthpix(0);  else    UnifiedOneForthPix(imgY, imgUV[0], imgUV[1],               mref[rpic], mcef[rpic][0], mcef[rpic][1],               Refbuf11[rpic]);}/*! ************************************************************************ * \brief *    Choose interpolation method depending on MV-resolution ************************************************************************ */void interpolate_frame_2()      // write to mref_P{  if(input->mv_res)    oneeighthpix(1);  else    UnifiedOneForthPix(imgY, imgUV[0], imgUV[1], mref_P, mcef_P[0], mcef_P[1], Refbuf11_P);}static void GenerateFullPelRepresentation (pel_t **Fourthpel, pel_t *Fullpel, int xsize, int ysize){  int x, y;  for (y=0; y<ysize; y++)    for (x=0; x<xsize; x++)      PutPel_11 (Fullpel, y, x, FastPelY_14 (Fourthpel, y*4, x*4));}/*! ************************************************************************ * \brief *    Upsample 4 times, store them in out4x.  Color is simply copied * * \par Input: *    srcy, srcu, srcv, out4y, out4u, out4v * * \par Side Effects_ *    Uses (writes) img4Y_tmp.  This should be moved to a static variable *    in this module ************************************************************************/void UnifiedOneForthPix (pel_t **imgY, pel_t** imgU, pel_t **imgV,                         pel_t **out4Y, pel_t **outU, pel_t **outV,                         pel_t *ref11){  int is;  int i,j,j4;  int ie2,je2,jj,maxy;

⌨️ 快捷键说明

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