FrameStream.h 3.9 KB

123456789101112131415161718192021222324252627282930313233343536373839404142434445464748495051525354555657585960616263646566676869707172737475767778798081828384858687888990919293949596979899100101102103104105106107108109110111112113114115116117118119120121122123124125126127128129130131132133134135136137138139140141142143144145146147148149150151152153
  1. /*
  2. * TI Voxel Lib component.
  3. *
  4. * Copyright (c) 2014 Texas Instruments Inc.
  5. */
  6. #ifndef VOXEL_FRAME_STREAM_H
  7. #define VOXEL_FRAME_STREAM_H
  8. #include <Frame.h>
  9. #include <SerializedObject.h>
  10. #include <FrameGenerator.h>
  11. #include "DataPacket.h"
  12. namespace Voxel
  13. {
  14. class CameraSystem;
  15. struct VOXEL_EXPORT FrameStreamHeader
  16. {
  17. char version[2]; // 0 -> major, 1 -> minor
  18. GeneratorIDType generatorIDs[3]; // For raw (processed), depth and point cloud, in that order
  19. };
  20. struct VOXEL_EXPORT FrameStreamPacket: public DataPacket
  21. {
  22. enum PacketType
  23. {
  24. PACKET_DATA = 0,
  25. PACKET_GENERATOR_CONFIG = 1
  26. };
  27. FrameStreamPacket(): DataPacket() {}
  28. };
  29. struct VOXEL_EXPORT GeneratorConfigurationSubPacket
  30. {
  31. uint8_t frameType;
  32. uint32_t size;
  33. SerializedObject config;
  34. bool read(SerializedObject &object);
  35. bool write(SerializedObject &object);
  36. };
  37. class VOXEL_EXPORT FrameStreamWriter
  38. {
  39. OutputFileStream &_stream;
  40. OutputFileStream _internalStream;
  41. Mutex _mutex;
  42. bool _isPaused = false;
  43. size_t _frameCount;
  44. FrameStreamHeader _header;
  45. FrameStreamPacket _rawpacket, _configPacket;
  46. GeneratorConfigurationSubPacket _generatorConfigSubPacket;
  47. bool _writeHeader();
  48. bool _init(GeneratorIDType processedRawFrameGeneratorID, GeneratorIDType depthFrameGeneratorID, GeneratorIDType pointCloudFrameGeneratorID);
  49. public:
  50. FrameStreamWriter(const String &filename, GeneratorIDType processedRawFrameGeneratorID, GeneratorIDType depthFrameGeneratorID, GeneratorIDType pointCloudFrameGeneratorID);
  51. FrameStreamWriter(OutputFileStream &stream, GeneratorIDType processedRawFrameGeneratorID, GeneratorIDType depthFrameGeneratorID, GeneratorIDType pointCloudFrameGeneratorID);
  52. inline bool isStreamGood() { return _stream.good(); }
  53. bool pause();
  54. bool resume();
  55. inline bool isPaused() { return _isPaused; }
  56. bool write(FramePtr rawUnprocessed);
  57. inline SerializedObject &getConfigObject() { return _generatorConfigSubPacket.config; }
  58. bool writeGeneratorConfiguration(uint frameType);
  59. // Assumes the config sub-packet has been populated by using getConfigObject()
  60. bool close();
  61. virtual ~FrameStreamWriter() { close(); }
  62. };
  63. typedef Ptr<FrameStreamWriter> FrameStreamWriterPtr;
  64. class VOXEL_EXPORT FrameStreamReader
  65. {
  66. InputFileStream &_stream;
  67. InputFileStream _internalStream;
  68. Vector<FileOffsetType> _allPacketOffsets;
  69. Vector<IndexType> _dataPacketLocation, _configPacketLocation;
  70. FrameStreamHeader _header;
  71. size_t _currentPacketIndex; // index on _allPacketOffsets
  72. size_t _currentFrameIndex; // index on _dataPacketLocation
  73. CameraSystem &_sys;
  74. Ptr<FrameGenerator> _frameGenerator[3]; // for processed raw, depth and point cloud
  75. FrameStreamPacket _dataPacket, _configPacket;
  76. GeneratorConfigurationSubPacket _configSubPacket;
  77. bool _init();
  78. bool _getPacket(size_t packetIndex, FrameStreamPacket &packet);
  79. bool _readConfigPacket(size_t packetIndex);
  80. public:
  81. FrameStreamReader(const String &fileName, CameraSystem &sys);
  82. FrameStreamReader(InputFileStream &stream, CameraSystem &sys);
  83. inline bool isStreamGood() { return _stream.good(); }
  84. Vector<FramePtr> frames; // 4 entries - raw (2 types), depth and point cloud corresponding to currently read frame index
  85. bool readNext();
  86. bool seekTo(size_t position);
  87. inline size_t currentPosition() { return _currentFrameIndex; }
  88. inline size_t size() { return _dataPacketLocation.size(); }
  89. template <typename T>
  90. bool getStreamParam(const String &name, T &value) const;
  91. bool close();
  92. virtual ~FrameStreamReader() {}
  93. };
  94. typedef Ptr<FrameStreamReader> FrameStreamReaderPtr;
  95. template <typename T>
  96. bool FrameStreamReader::getStreamParam(const String &name, T &value) const
  97. {
  98. if(!_frameGenerator[0]->get(name, value) && !_frameGenerator[1]->get(name, value) && !_frameGenerator[2]->get(name, value))
  99. return false;
  100. return true;
  101. }
  102. }
  103. #endif