/// <summary> /// Consturctor /// </summary> /// <param name="tsRfxCodecQuantVals">Codec quantity values array</param> /// <param name="quantIdxY">Index of Y component in quantity array</param> /// <param name="quantIdxCb">Index of Cb component in quantity array</param> /// <param name="quantIdxCr">Index of Cr component in quantity array</param> /// <param name="bProgressive">indicates if use progressive codec</param> /// <param name="bTileDiff">indicates if sub-diffing</param> /// <param name="bReduceExtrapolate">Indicates if use Reduce-Extrapolate method in DWT</param> public RfxProgressiveCodecContext( TS_RFX_CODEC_QUANT[] tsRfxCodecQuantVals, byte quantIdxY, byte quantIdxCb, byte quantIdxCr, bool bProgressive = false, bool bTileDiff = true, bool bReduceExtrapolate = true) : base(tsRfxCodecQuantVals, quantIdxY, quantIdxCb, quantIdxCr, EntropyAlgorithm.CLW_ENTROPY_RLGR1) { UseProgressive = bProgressive; UseDifferenceTile = bTileDiff; UseReduceExtrapolate = bReduceExtrapolate; prevProgQuant = RdpegfxTileUtils.GetProgCodecQuant(ProgressiveChunk_Values.kChunk_None); }
/// <summary> /// Encode a Tile /// </summary> /// <param name="encodingContext">The tile encoding context</param> /// <param name="enTileInfo">The tile to be encoded</param> /// <returns>A array of CompressedTile which contains the encoded tiles</returns> public static EncodedTile[] EncodeTile(RfxProgressiveCodecContext encodingContext, TileState enTileInfo) { EncodedTileType targetType = encodingContext.UseProgressive ? EncodedTileType.FirstPass : EncodedTileType.Simple; //File RGB FillRgbData(encodingContext, enTileInfo.GetRgb()); //Do color conversion RemoteFXEncoder.RGBToYCbCr(encodingContext); //Do DWT if (encodingContext.UseReduceExtrapolate) { //Do DWT using UseReduce Extrapolate method DWT(encodingContext); } else { RemoteFXEncoder.DWT(encodingContext); } //Do quantiztion Quantization(encodingContext); //Do linearization (LL3 delta not computed) Linearization_NoLL3Delta(encodingContext); //Update new DWT to tile DwtTile dwt = new DwtTile( (short[])encodingContext.YComponent.Clone(), (short[])encodingContext.CbComponent.Clone(), (short[])encodingContext.CrComponent.Clone(), encodingContext.CodecQuantVals, encodingContext.QuantIdxY, encodingContext.QuantIdxCb, encodingContext.QuantIdxCr, encodingContext.UseReduceExtrapolate ); enTileInfo.UpdateDwt(dwt); //Sub-Band Diffing if (encodingContext.UseDifferenceTile) { SubBandDiffing_DT(encodingContext, enTileInfo); } if (targetType == EncodedTileType.Simple) { ComputeLL3Deltas(encodingContext); RemoteFXEncoder.RLGREncode(encodingContext); EncodedTile cpTile = new EncodedTile(); cpTile.YEncodedData = (byte[])encodingContext.YData.Clone(); cpTile.CbEncodedData = (byte[])encodingContext.CbData.Clone(); cpTile.CrEncodedData = (byte[])encodingContext.CrData.Clone(); cpTile.DataType = EncodedTileType.Simple; cpTile.IsDifferenceTile = encodingContext.UseDifferenceTile; cpTile.UseReduceExtrapolate = encodingContext.UseReduceExtrapolate; cpTile.CodecQuantVals = encodingContext.CodecQuantVals; cpTile.QuantIdxY = encodingContext.QuantIdxY; cpTile.QuantIdxCb = encodingContext.QuantIdxCb; cpTile.QuantIdxCr = encodingContext.QuantIdxCr; cpTile.ProgCodecQuant = null; return(new EncodedTile[] { cpTile }); } else { List <EncodedTile> progCTileList = new List <EncodedTile>(); //Init DRS, DAS encodingContext.DRS = new DwtTile(encodingContext.YComponent, encodingContext.CbComponent, encodingContext.CrComponent); encodingContext.DAS = new DwtTile(new short[RdpegfxTileUtils.ComponentElementCount], new short[RdpegfxTileUtils.ComponentElementCount], new short[RdpegfxTileUtils.ComponentElementCount]); #region Chunk 25, first pass ProgressiveQuantization(encodingContext, ProgressiveChunk_Values.kChunk_25); //Compute ProgQ LL3 deltas encodingContext.YComponent = encodingContext.ProgQ.Y_DwtQ; encodingContext.CbComponent = encodingContext.ProgQ.Cb_DwtQ; encodingContext.CrComponent = encodingContext.ProgQ.Cr_DwtQ; ComputeLL3Deltas(encodingContext); RemoteFXEncoder.RLGREncode(encodingContext); EncodedTile firstPassTile = new EncodedTile(); firstPassTile.YEncodedData = (byte[])encodingContext.YData.Clone(); firstPassTile.CbEncodedData = (byte[])encodingContext.CbData.Clone(); firstPassTile.CrEncodedData = (byte[])encodingContext.CrData.Clone(); firstPassTile.DataType = EncodedTileType.FirstPass; firstPassTile.IsDifferenceTile = encodingContext.UseDifferenceTile; firstPassTile.UseReduceExtrapolate = encodingContext.UseReduceExtrapolate; firstPassTile.CodecQuantVals = encodingContext.CodecQuantVals; firstPassTile.QuantIdxY = encodingContext.QuantIdxY; firstPassTile.QuantIdxCb = encodingContext.QuantIdxCb; firstPassTile.QuantIdxCr = encodingContext.QuantIdxCr; firstPassTile.ProgCodecQuant = RdpegfxTileUtils.GetProgCodecQuant(ProgressiveChunk_Values.kChunk_25); progCTileList.Add(firstPassTile); encodingContext.prevProgQuant = RdpegfxTileUtils.GetProgCodecQuant(ProgressiveChunk_Values.kChunk_25); //Update DRS encodingContext.DRS.Sub(encodingContext.DTS); //Update DAS encodingContext.DAS.Add(encodingContext.DTS); #endregion #region Chunk 50,75,100, upgrade pass ProgressiveChunk_Values[] upgradeChunks = { ProgressiveChunk_Values.kChunk_50, ProgressiveChunk_Values.kChunk_75, ProgressiveChunk_Values.kChunk_100 }; foreach (ProgressiveChunk_Values tChunk in upgradeChunks) { ProgressiveQuantization(encodingContext, tChunk); RFX_PROGRESSIVE_CODEC_QUANT progquant = RdpegfxTileUtils.GetProgCodecQuant(tChunk); progCTileList.Add(SRLEncode(encodingContext, progquant)); //Update DRS encodingContext.DRS.Sub(encodingContext.DTS); //Update DAS encodingContext.DAS.Add(encodingContext.DTS); encodingContext.prevProgQuant = progquant; } return(progCTileList.ToArray()); #endregion } }