| | 45 | |
|---|
| | 46 | DataHBuffer::DataHBuffer(size_t bufferSize) |
|---|
| | 47 | { |
|---|
| | 48 | buffer = new uint8_t[bufferSize]; |
|---|
| | 49 | allocatedSize = bufferSize; |
|---|
| | 50 | fileOffset = -1; |
|---|
| | 51 | dataSize = 0; |
|---|
| | 52 | } |
|---|
| | 53 | |
|---|
| | 54 | DataHBuffer::~DataHBuffer() |
|---|
| | 55 | { |
|---|
| | 56 | if (buffer) |
|---|
| | 57 | delete[] buffer; |
|---|
| | 58 | } |
|---|
| | 59 | |
|---|
| | 60 | void DataHBuffer::Realloc(size_t bufferSize) |
|---|
| | 61 | { |
|---|
| | 62 | if (buffer) |
|---|
| | 63 | delete[] buffer; |
|---|
| | 64 | |
|---|
| | 65 | buffer = new uint8_t[bufferSize]; |
|---|
| | 66 | allocatedSize = bufferSize; |
|---|
| | 67 | fileOffset = -1; |
|---|
| | 68 | dataSize = 0; |
|---|
| | 69 | } |
|---|
| | 70 | |
|---|
| | 71 | bool DataHBuffer::ContainsOffset(uint64_t offset) |
|---|
| | 72 | { |
|---|
| | 73 | return offset >= fileOffset && offset < fileOffset + dataSize; |
|---|
| | 74 | } |
|---|
| | 75 | |
|---|
| | 76 | uint8_t * DataHBuffer::GetBuffer(uint64_t offset, size_t size) |
|---|
| | 77 | { |
|---|
| | 78 | if (size > allocatedSize) |
|---|
| | 79 | Realloc(size); |
|---|
| | 80 | |
|---|
| | 81 | fileOffset = offset; |
|---|
| | 82 | dataSize = size; |
|---|
| | 83 | return buffer; |
|---|
| | 84 | } |
|---|
| | 85 | |
|---|
| | 86 | size_t DataHBuffer::Read(uint64_t offset, size_t size, uint8_t *store) |
|---|
| | 87 | { |
|---|
| | 88 | if (!ContainsOffset(offset)) |
|---|
| | 89 | return 0; |
|---|
| | 90 | |
|---|
| | 91 | uint8_t *dataStart = buffer + (offset - fileOffset); |
|---|
| | 92 | size_t amountToRead = MIN(fileOffset + dataSize - offset, size); |
|---|
| | 93 | memcpy(store, dataStart, amountToRead); |
|---|
| | 94 | return amountToRead; |
|---|
| | 95 | } |
|---|
| | 96 | |
|---|
| | 97 | |
|---|
| 132 | | if (mCurrentPosition + Size > filesize) |
|---|
| 133 | | Size = filesize - mCurrentPosition; |
|---|
| 134 | | |
|---|
| 135 | | if (supportsWideOffsets) { |
|---|
| 136 | | wide wideOffset = SInt64ToWide(mCurrentPosition); |
|---|
| 137 | | |
|---|
| 138 | | err = DataHScheduleData64(dataHandler, (Ptr)Buffer, &wideOffset, Size, 0, NULL, NULL); |
|---|
| 139 | | } else { |
|---|
| 140 | | err = DataHScheduleData(dataHandler, (Ptr)Buffer, mCurrentPosition, Size, 0, NULL, NULL); |
|---|
| 141 | | } |
|---|
| 142 | | |
|---|
| 143 | | if (err) { |
|---|
| 144 | | throw CRTError("Error reading data", err); |
|---|
| 145 | | } |
|---|
| 146 | | mCurrentPosition += Size; |
|---|
| 147 | | |
|---|
| 148 | | // does QuickTime tell us how much it's read? |
|---|
| 149 | | return Size; |
|---|
| 150 | | } |
|---|
| 151 | | |
|---|
| 152 | | void DataHandlerCallback::setFilePointer(int64 Offset, LIBEBML_NAMESPACE::seek_mode Mode) |
|---|
| | 187 | if (mCurrentPosition + size > filesize) |
|---|
| | 188 | size = filesize - mCurrentPosition; |
|---|
| | 189 | |
|---|
| | 190 | while (size > 0) { |
|---|
| | 191 | if (dataBuffer.ContainsOffset(mCurrentPosition)) { |
|---|
| | 192 | amountRead = dataBuffer.Read(mCurrentPosition, size, myBuffer); |
|---|
| | 193 | myBuffer += amountRead; |
|---|
| | 194 | mCurrentPosition += amountRead; |
|---|
| | 195 | size -= amountRead; |
|---|
| | 196 | } |
|---|
| | 197 | |
|---|
| | 198 | if (size <= 0) |
|---|
| | 199 | break; |
|---|
| | 200 | |
|---|
| | 201 | internalBuffer = dataBuffer.GetBuffer(mCurrentPosition, READ_SIZE); |
|---|
| | 202 | |
|---|
| | 203 | if (supportsWideOffsets) { |
|---|
| | 204 | wide wideOffset = SInt64ToWide(mCurrentPosition); |
|---|
| | 205 | |
|---|
| | 206 | err = DataHScheduleData64(dataHandler, (Ptr)internalBuffer, &wideOffset, |
|---|
| | 207 | READ_SIZE, 0, NULL, NULL); |
|---|
| | 208 | } else { |
|---|
| | 209 | err = DataHScheduleData(dataHandler, (Ptr)internalBuffer, mCurrentPosition, |
|---|
| | 210 | READ_SIZE, 0, NULL, NULL); |
|---|
| | 211 | } |
|---|
| | 212 | |
|---|
| | 213 | if (err) { |
|---|
| | 214 | throw CRTError("Error reading data", err); |
|---|
| | 215 | } |
|---|
| | 216 | } |
|---|
| | 217 | |
|---|
| | 218 | return mCurrentPosition - oldPos; |
|---|
| | 219 | } |
|---|
| | 220 | |
|---|
| | 221 | void DataHandlerCallback::setFilePointer(int64 Offset, seek_mode Mode) |
|---|