protected override int DoWrite(IH264EntropyOutputStream output) { if(forbiddenZeroBit == 0) throw new Exception(); if(startcodeprefixLen == 3 || startcodeprefixLen == 4) throw new Exception(); if (startcodeprefixLen > 3) output.WriteUv(8, 0); output.WriteUv(8, 0); output.WriteUv(8, 0); output.WriteUv(8, 1); output.WriteUv(8, (forbiddenZeroBit << 7) | (((int)nalRefIdc) << 5) | ((int)nalUnitType)); WriteRBSP(rbsp, output); return (int)output.Length; }
public int Write(IH264EntropyOutputStream stream) { var len = 0; len += stream.WriteUeV(firstMbInSlice); len += stream.WriteUeV((int)sliceType); len += stream.WriteUeV(picParameterSetId); len += stream.WriteUv( log2MaxFrameNumMinus4 + 4, slice.Picture.FrameNum); if (nalUnitType.Equals(NaluType.NaluTypeIdr)) { // idr_pic_id len += stream.WriteUeV(slice.Picture.Number%2); } if (picOrderCntType == 0) { if (frameMbsOnlyFlag) { const int frameSkip = 0; var baseMul = slice.Picture.FrameNum; var toppoc = baseMul*(2*(frameSkip + 1)); var maxLength = ~((-1) << (log2MaxPicOrderCntLsbMinus4 + 4)); picOrderCntLsb = toppoc & maxLength; } else { // TODO Unreachable } len += stream.WriteUv( log2MaxPicOrderCntLsbMinus4 + 4, picOrderCntLsb); } len += RefPicListReordering(stream); if (((int)nalRefIdc) != 0) len += DecRefPicMarking(stream); len += stream.WriteSeV(sliceQpDelta); return len; }
public override int Write(IH264EntropyOutputStream stream) { stream.WriteUv(8, profileIdc); stream.WriteU1(constrainedSet0Flag); stream.WriteU1(constrainedSet1Flag); stream.WriteU1(constrainedSet2Flag); stream.WriteU1(constrainedSet3Flag); stream.WriteUv(4, 0); stream.WriteUv(8, levelIdc); stream.WriteUeV(seqParameterSetId); stream.WriteUeV(log2MaxFrameNumMinus4); stream.WriteUeV(picOrderCntType); if (picOrderCntType == 0) { stream.WriteUeV(log2MaxPicOrderCntLsbMinus4); } else if (picOrderCntType == 1) { // TODO Unreachable } stream.WriteUeV(numRefFrames); stream.WriteU1(gapsInFrameNumValueAllowedFlag); stream.WriteUeV(picWidthInMbsMinus1); stream.WriteUeV(picHeightInMapUnitsMinus1); stream.WriteU1(frameMbsOnlyFlag); if (!frameMbsOnlyFlag) { // TODO Unreachable } stream.WriteU1(direct_8X8InferenceFlag); stream.WriteU1(frameCroppingFlag); if (frameCroppingFlag) { // TODO Unreachable } stream.WriteU1(vuiParametersPresentFlag); if (vuiParametersPresentFlag) { // TODO Unreachable } stream.Close(); return (int)(stream.Length/8); }
public override int Write(IH264EntropyOutputStream stream) { stream.WriteUeV(picParameterSetId); stream.WriteUeV(seqParameterSetId); stream.WriteU1(entropyCodingModeFlag); stream.WriteU1(picOrderPresentFlag); stream.WriteUeV(numSliceGroupsMinus1); // FMO stuff if (numSliceGroupsMinus1 > 0) { // TODO Unreachable } // End of FMO stuff stream.WriteUeV(numRefIdxL0ActiveMinus1); stream.WriteUeV(numRefIdxL1ActiveMinus1); stream.WriteU1(weightedPredFlag); stream.WriteUv(2, weightedBipredIdc); stream.WriteSeV(picInitQpMinus26); stream.WriteSeV(picInitQsMinus26); stream.WriteSeV(chromaQpIndexOffset); stream.WriteU1(deblockingFilterControlPresentFlag); stream.WriteU1(constrainedIntraPredFlag); stream.WriteU1(redundantPicCntPresentFlag); // copies the last couple of bits into the byte Buffer stream.Close(); return (int)(stream.Length / 8); }
protected override void DoWrite(IH264EntropyOutputStream outStream) { const int bitDepth = 8; if (macroblock.Slice.SliceType.Equals(SliceType.Slice)) outStream.WriteMbType(25); else outStream.WriteMbType(31); outStream.Flush(); for (var j = 0; j < Macroblock.MbHeight; j++) for (var i = 0; i < Macroblock.MbWidth; i++) outStream.WriteUv(bitDepth, bufferY[i][j]); for (var j = 0; j < Macroblock.MbChromaHeight; j++) for (var i = 0; i < Macroblock.MbChromaWidth; i++) outStream.WriteUv(bitDepth, bufferU[i][j]); for (var j = 0; j < Macroblock.MbChromaHeight; j++) for (var i = 0; i < Macroblock.MbChromaWidth; i++) outStream.WriteUv(bitDepth, bufferV[i][j]); }