BitStreamWriter.cs 1.6 KB

123456789101112131415161718192021222324252627282930313233343536373839404142434445464748495051525354555657585960616263646566676869707172737475
  1. using System.IO;
  2. namespace Ryujinx.Graphics.VDec
  3. {
  4. class BitStreamWriter
  5. {
  6. private const int BufferSize = 8;
  7. private Stream _baseStream;
  8. private int _buffer;
  9. private int _bufferPos;
  10. public BitStreamWriter(Stream baseStream)
  11. {
  12. _baseStream = baseStream;
  13. }
  14. public void WriteBit(bool value)
  15. {
  16. WriteBits(value ? 1 : 0, 1);
  17. }
  18. public void WriteBits(int value, int valueSize)
  19. {
  20. int valuePos = 0;
  21. int remaining = valueSize;
  22. while (remaining > 0)
  23. {
  24. int copySize = remaining;
  25. int free = GetFreeBufferBits();
  26. if (copySize > free)
  27. {
  28. copySize = free;
  29. }
  30. int mask = (1 << copySize) - 1;
  31. int srcShift = (valueSize - valuePos) - copySize;
  32. int dstShift = (BufferSize - _bufferPos) - copySize;
  33. _buffer |= ((value >> srcShift) & mask) << dstShift;
  34. valuePos += copySize;
  35. _bufferPos += copySize;
  36. remaining -= copySize;
  37. }
  38. }
  39. private int GetFreeBufferBits()
  40. {
  41. if (_bufferPos == BufferSize)
  42. {
  43. Flush();
  44. }
  45. return BufferSize - _bufferPos;
  46. }
  47. public void Flush()
  48. {
  49. if (_bufferPos != 0)
  50. {
  51. _baseStream.WriteByte((byte)_buffer);
  52. _buffer = 0;
  53. _bufferPos = 0;
  54. }
  55. }
  56. }
  57. }