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

📄 mpeg_sc.cpp

📁 H.264完整的C语言代码和DCT的代码
💻 CPP
📖 第 1 页 / 共 5 页
字号:
    im_stream<im_half2> NAMED(CrCbMVref) = newStreamData<im_half2>(num_MB*2*8*8/2); 
    im_stream<im_half2> NAMED(Ydiff)     = newStreamData<im_half2>(num_MB*4*64/2); 
    im_stream<im_half2> NAMED(CrCbdiff)  = newStreamData<im_half2>(num_MB*2*64/2); 

    im_stream<im_half2>  NAMED(rowMV) = newStreamData<im_half2>(mpeg_rtny(mb_width*2, 8)); 
    im_stream<im_ubyte4> NAMED(row0) = newStreamData<im_ubyte4>(mb_width*16*16/4); 
    im_stream<im_ubyte4> NAMED(row1) = newStreamData<im_ubyte4>(mb_width*16*16/4); 
    im_stream<im_ubyte4> NAMED(row2) = newStreamData<im_ubyte4>(mb_width*16*16/4); 
    im_stream<im_ubyte4> NAMED(mblks) = newStreamData<im_ubyte4>(mb_width*16*16/4);

    im_stream<im_int> NAMED(idx_gen_str);

    im_stream<im_half2> NAMED(zerolen_str) = newStreamData<im_half2>(0);


    //此处添加
	int rlen = mb_width*16*16/4;
    im_stream<im_ubyte4> r0(rlen), r1(rlen), r2(rlen);
	bool firstRow = 0;
    bool lastRow = 0;
	int ref_idx = 2*rlen;

    
	
	if (byrow)
    {
      int rlen = mb_width*16*16/4;
      int run_levels_pos = 0;
      int last_idx_type = -1;

      im_stream<im_half2>  NAMED(rowRunLevels);

      for (int row = 0; row < mb_height; row++)
      // for_FIXED (int row = 0; row < mb_height; row++)
      {
        // loopIter(row == 0 || row == mb_height - 1, (row % 2) == 1);

        int idx_type = (row == mb_height - 1 ? lasttype : lastcoltype);
        if (last_idx_type == -1 || last_idx_type != idx_type) {
          im_uc<im_int> idx_params = (idx_type << 16) + mb_width;
          idx_gen_str = newStreamData<im_int>(mb_width*16*16);
          idxGen(idx_gen_str, image_size_param, idx_params);
          last_idx_type = idx_type;
        }
  
        fa = row*16*iwidth;
        im_stream<im_ubyte4> NAMED(rowInput) = 
          newStreamData<im_ubyte4>(mb_width*16*16);
        im_stream<im_ubyte4> NAMED(rowY1blk) =
          Y1blk(row*(mb_width*16*16/4), (row+1)*(mb_width*16*16/4));
        im_stream<im_half2>  NAMED(rowCrCb1dct) = 
          CrCb1dct(row*(mb_width*2*64/2), (row+1)*(mb_width*2*64/2));
        im_stream<im_half2>  NAMED(rowMV) = 
          MV(row*(mb_width*2), row*(mb_width*2) + mpeg_rtny(mb_width*2, 8));
        im_stream<im_uint>   NAMED(rowYidx) = 
          Yidx(row*(mb_width*16*16/4), (row+1)*(mb_width*16*16/4));
        im_stream<im_uint>   NAMED(rowCrCbidx) = 
          CrCbidx(row*(mb_width*2*8*8/2), (row+1)*(mb_width*2*8*8/2));
        im_stream<im_ubyte4> NAMED(rowYMVref) = 
          YMVref(row*(mb_width*4*8*8/4), (row+1)*(mb_width*4*8*8/4));
        im_stream<im_half2>  NAMED(rowCrCbMVref) = 
          CrCbMVref(row*(mb_width*2*8*8/2), (row+1)*(mb_width*2*8*8/2));
        im_stream<im_half2>  NAMED(rowYdiff) = 
          Ydiff(row*(mb_width*4*64/2), (row+1)*(mb_width*4*64/2));
        im_stream<im_half2>  NAMED(rowCrCbdiff) = 
          CrCbdiff(row*(mb_width*2*64/2), (row+1)*(mb_width*2*64/2));
        im_stream<im_half2>  NAMED(rowY2rle) = 
          Y2rle(row*(mb_width*4*64/2), (row+1)*(mb_width*4*64/2));
        im_stream<im_half2>  rowCrCb2rle = 
          CrCb2rle(row*(mb_width*2*64/2), (row+1)*(mb_width*2*64/2));
        im_stream<im_half2>  NAMED(rowY3) = 
          Y3(row*(mb_width*4*64/2), (row+1)*(mb_width*4*64/2));
        im_stream<im_half2>  NAMED(rowCrCb3) = 
          CrCb3(row*(mb_width*2*64/2), (row+1)*(mb_width*2*64/2));
        im_stream<im_ubyte4> NAMED(rowYref) = 
          Yref(row*(mb_width*4*8*8/4), (row+1)*(mb_width*4*8*8/4));
        im_stream<im_half2>  NAMED(rowCrCbref) = 
          CrCbref(row*(mb_width*2*8*8/2), (row+1)*(mb_width*2*8*8/2));
        im_stream<im_ubyte4> NAMED(rowYref2) = 
          Yref2(row*(mb_width*4*8*8/4), (row+1)*(mb_width*4*8*8/4));
        im_stream<im_half2>  NAMED(rowCrCbref2) = 
          CrCbref2(row*(mb_width*2*8*8/2), (row+1)*(mb_width*2*8*8/2));

        streamCopy(image(fa, ilen, im_var_pos, im_acc_index, idx_gen_str),
          rowInput);

        pcolor(rowInput, rowY1blk, rowCrCb1dct);


        streamSaveFile("h264/row0.txt", "txt", "x2", row0);
		streamSaveFile("h264/row1.txt", "txt", "x2", row1);
		streamSaveFile("h264/row2.txt", "txt", "x2", row2);
		streamSaveFile("h264/rowY1blk.txt", "txt", "x2", rowY1blk);




        //此处修改!
        im_uc<im_int> margin = ( firstRow ? 0 : 0x10 ) | ( lastRow ? 0 : 0x1000 );
        im_uc<im_int> offsets ((row*16) << 16);
        im_uc<im_int> num_mb = mb_width;
        if ( (row % 3) == 0 ) {
          me_fast_search4(row0, row1, row2, rowY1blk, rowMV, margin, num_mb);
          me_fast_jitter2(row0, row1, row2, rowY1blk, rowMV, rowMV, margin, num_mb);
          me_fast_jitter1(row0, row1, row2, rowY1blk, rowMV, rowMV, rowYMVref, rowCrCbidx, margin, offsets, num_mb, num_mb);
          streamCopy(Yref(ref_idx, ref_idx+rlen), r0);
		} else if ( (row % 3) == 1 ) {
          me_fast_search4(row1, row2, row0, rowY1blk, rowMV, margin, num_mb);
          me_fast_jitter2(row1, row2, row0, rowY1blk, rowMV, rowMV, margin, num_mb);
          me_fast_jitter1(row1, row2, row0, rowY1blk, rowMV, rowMV, rowYMVref, rowCrCbidx, margin, offsets, num_mb, num_mb);
		  streamCopy(Yref(ref_idx, ref_idx+rlen), r1);      
		} else if ( (row % 3) == 2 ) {
          me_fast_search4(row2, row0, row1, rowY1blk, rowMV, margin, num_mb);
          me_fast_jitter2(row2, row0, row1, rowY1blk, rowMV, rowMV, margin, num_mb);
          me_fast_jitter1(row2, row0, row1, rowY1blk, rowMV, rowMV, rowYMVref, rowCrCbidx, margin, offsets, num_mb, num_mb);
          streamCopy(Yref(ref_idx, ref_idx+rlen), r2);
		}//row影响到kernel调用前3个参数的顺序
        ref_idx = (row >= (mb_height - 3)) ? ref_idx : ref_idx + rlen;

        
		streamSaveFile("h264/rowMV.txt", "txt", "x2", rowMV);

        
			
		row0 = (row == 0) 
          ? newStreamData<im_ubyte4>(mb_width*16*16/4)  // dummy
          : Yref((row-1)*rlen, row*rlen);
        row1 = Yref(row*rlen, (row+1)*rlen);
        row2 = (row == (mb_height - 1))
          ? newStreamData<im_ubyte4>(mb_width*16*16/4)  // dummy
          : Yref((row+1)*rlen, (row+2)*rlen);

        int loc = ( ( row == 0 ) ? 1 : 0 ) |
          ( ( row == mb_height - 1 ) ? 2 : 0 );

		//streamSaveFile("mpeg_sc/row0.txt", "txt", "x2", row0);
		//streamSaveFile("mpeg_sc/row1.txt", "txt", "x2", row1);
		//streamSaveFile("mpeg_sc/row2.txt", "txt", "x2", row2);
		//streamSaveFile("mpeg_sc/rowY1blk.txt", "txt", "x2", rowY1blk);

        //blocksearch(row0, row1, row2, rowY1blk, rowMV, im_uc<im_int>(loc));

		//streamSaveFile("mpeg_sc/motion.txt", "txt", "x2", rowMV);

        im_uc<im_int> mb1 = im_uc<im_int>(mb_width);
        im_uc<im_int> mb2 = im_uc<im_int>(mb_width);
        MV2idx(rowMV, rowYidx, rowCrCbidx, 
               im_uc<im_int>((row*16) << 16), mb1, mb2);

        rowYMVref = Yref(0, Yref.getLength(), 
                         false, im_acc_index, rowYidx);
        rowCrCbMVref = CrCbref(0, CrCbref.getLength(), 
                               false, im_acc_index, rowCrCbidx);

        difference(rowY1blk, rowCrCb1dct, rowYMVref, rowCrCbMVref, 
                   rowYdiff, rowCrCbdiff);

        dct(rowYdiff, dct_non_intra_consts, rowY2rle, quantizer_scale);
        dct(rowCrCbdiff, dct_non_intra_consts, rowCrCb2rle, quantizer_scale);

        // Keep track of current position in run_levels so that we
        // can append to the stream correctly - hopefully Peter will
        // make this work nicer someday.
        if (row != 0) {
          run_levels_pos += rowRunLevels.getLength();
        }
        rowRunLevels =
          run_levels(run_levels_pos, run_levels.getLength(), 
          im_countup | im_var_pos | im_var_size);
        rle(rowY2rle, rowCrCb2rle, rle_consts, rowMV, rowRunLevels, pframe,
            qs);

        // save run levels to memory as output frame

        idct(rowY2rle, idct_non_intra_consts, rowY3, iquantizer_scale);
        idct(rowCrCb2rle, idct_non_intra_consts, rowCrCb3, iquantizer_scale);

        correlate(rowY3, rowCrCb3, rowYMVref, rowCrCbMVref, 
                  rowYref2, rowCrCbref2, pframe);
      }
    }
    else
    {
      if (dumpfiles)
      {
        sprintf(outfilename, "mpeg_sc/pinput%d.txt", i);
        streamSaveFile(outfilename, "txt", "x4", Input);
      }

      // COLOR
      if (!pcref) {
        pcolor(Input, Y1blk, CrCb1dct);
      } else {
        pcolorref(scd, n, Y1blk, CrCb1dct);
      }

      if (dumpfiles)
      {
        sprintf(outfilename, "mpeg_sc/ypcolor%d.txt", i);
        streamSaveFile(outfilename, "txt", "x4", Y1blk);
        sprintf(outfilename, "mpeg_sc/cpcolor%d.txt", i);
        streamSaveFile(outfilename, "txt", "x2", CrCb1dct);
      }

      // Blocksearch
      if (!bsref) {
        int rlen = mb_width*16*16/4;
        row0 = row1 = row2 = Yref(0, rlen);
        for (int row = 0; row < mb_height; row++)
        {
          row0 = row1;
          row1 = row2;
          row2 = ((row != (mb_height - 1)) ?
                  Yref((row+1)*rlen, (row+2)*rlen) : row1);
          mblks = Y1blk(row*rlen, (row+1)*rlen);
          rowMV = MV(row*mb_width*2, row*mb_width*2 + mpeg_rtny(mb_width*2, 8));

          //int loc = ( row == 0 ) | ( ( row == mb_height-1 ) << 1 );
          int loc = ( ( row == 0 ) ? 1 : 0 ) |
            ( ( row == mb_height - 1 ) ? 2 : 0 );

          //blocksearch(row0, row1, row2, mblks, rowMV, im_uc<im_int>(loc) );
        }
      } else {
        blocksearchref(scd, Y1blk, Yref, MV);
      }

      if (dumpfiles)
      {
        sprintf(outfilename, "mpeg_sc/mv%d.txt", i);
        streamSaveFile(outfilename, "txt", "x2", MV);
      }

      // Get original macroblocks and difference them with current macroblocks
      if (!mvref) {
        for (int row = 0; row < mb_height; row++)
        {
          int rlen = mb_width*16*16/4;
          im_stream<im_half2> NAMED(rowMV) = MV(row*mb_width*2, (row+1)*mb_width*2);
          im_stream<im_uint>  NAMED(rowYidx)    = Yidx(row*rlen, (row+1)*rlen);
          im_stream<im_uint>  NAMED(rowCrCbidx) = CrCbidx(row*rlen, (row+1)*rlen);

          im_uc<im_int> mb1 = im_uc<im_int>(mb_width);
          im_uc<im_int> mb2 = im_uc<im_int>(mb_width);
          MV2idx(rowMV, rowYidx, rowCrCbidx, 
                 im_uc<im_int>((row*16) << 16), mb1, mb2);
        }
      } else {
        mv2idxref(scd, MV, Yidx, CrCbidx, width);
      }

      if (dumpfiles)
      {
        sprintf(outfilename, "mpeg_sc/yidx%d.txt", i);
        streamSaveFile(outfilename, "txt", "x", Yidx);
        sprintf(outfilename, "mpeg_sc/cidx%d.txt", i);
        streamSaveFile(outfilename, "txt", "x", CrCbidx);
      }

      YMVref = Yref(0, Yref.getLength(), false, im_acc_index, Yidx);
      CrCbMVref = CrCbref(0, CrCbref.getLength(), false, im_acc_index, CrCbidx);

      if (dumpfiles)
      {
        sprintf(outfilename, "mpeg_sc/ymvref%d.txt", i);
        streamSaveFile(outfilename, "txt", "x4", YMVref);
        sprintf(outfilename, "mpeg_sc/cmvref%d.txt", i);
        streamSaveFile(outfilename, "txt", "x2", CrCbMVref);
      }

      difference(Y1blk, CrCb1dct, YMVref, CrCbMVref, Ydiff, CrCbdiff);

      if (dumpfiles)
      {
        sprintf(outfilename, "mpeg_sc/ydiff%d.txt", i);
        streamSaveFile(outfilename, "txt", "x2", Ydiff);
        sprintf(outfilename, "mpeg_sc/cdiff%d.txt", i);
        streamSaveFile(outfilename, "txt", "x2", CrCbdiff);
      }

      // DCT
      if (!dref) {
        // streamLoadVect(dct_non_intra_consts_v, dct_non_intra_consts);
        dct(Ydiff, dct_non_intra_consts, qref ? Y2:Y2rle, quantizer_scale);
        // streamLoadVect(dct_non_intra_consts_v, dct_non_intra_consts);
        dct(CrCbdiff, dct_non_intra_consts, qref ? CrCb2:CrCb2rle,
            quantizer_scale);
      } else {
        dctref(scd, Ydiff, Y2);
        dctref(scd, CrCbdiff, CrCb2);
      }
      if (qref) {
        quantref(scd, Y2, Y2rle, quant_scale, false);
        quantref(scd, CrCb2, CrCb2rle, quant_scale, false);
      }

      if (dumpfiles)
      {
        sprintf(outfilename, "mpeg_sc/ypdct%d.txt", i);
        streamSaveFile(outfilename, "txt", "x2", Y2rle);
        sprintf(outfilename, "mpeg_sc/cpdct%d.txt", i);
        streamSaveFile(outfilename, "txt", "x2", CrCb2rle);
      }

      // IDCT
      if (iqref) {
        iquantref(scd, Y2rle, Y2, quant_scale, false);
        iquantref(scd, CrCb2rle, CrCb2, quant_scale, false);
      }
      if (!idref) {
        // streamLoadVect(idct_non_intra_consts_v, idct_non_intra_consts);
        idct(iqref ? Y2:Y2rle, idct_non_intra_consts, Y3, iquantizer_scale);
        // streamLoadVect(idct_non_intra_consts_v, idct_non_intra_consts);
        idct(iqref ? CrCb2:CrCb2rle, idct_non_intra_consts, CrCb3, iquantizer_scale);
      } else {
        idctref(scd, Y2, Y3);
        idctref(scd, CrCb2, CrCb3);
      }

      if (dumpfiles)
      {
        sprintf(outfilename, "mpeg_sc/ypidct%d.txt", i);
        streamSaveFile(outfilename, "txt", "x2", Y3);
        sprintf(outfilename, "mpeg_sc/cpidct%d.txt", i);
        streamSaveFile(outfilename, "txt", "x2", CrCb3);
      }

      // Correlate
      correlate(Y3, CrCb3, YMVref, CrCbMVref, Yref2, CrCbref2, pframe);

      if (dumpfiles)
      {
        sprintf(outfilename, "mpeg_sc/ypref%d.txt", i);
        streamSaveFile(outfilename, "txt", "x4", Yref);
        sprintf(outfilename, "mpeg_sc/cpref%d.txt", i);
        streamSaveFile(outfilename, "txt", "x2", CrCbref);
      }
    }
}


void mpeg_macro(StreamSchedulerInterface& scd, String args)
{
  char *s = args.char_ptr();
  char *s2 = s;

  String parmfile = get_next_word(&s);
  String parm2 = get_next_word(&s);
  String parm3 = get_next_word(&s);

  bool encode_isim = (parm2 == "encode_isim");
  
  args.delete_char_ptr(s2);

  // idct_test();
  // pframe_test();
  // mv2idx_test();
  // pcolor_test();
  // diff_test();
  // corr_test();
  // blocksearch_test();
  // return;

  readparmfile(parmfile.char_ptr());

  char tplorg2[256];

⌨️ 快捷键说明

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