| 348 | } |
| 349 | |
| 350 | MappedFrame FrameMapper::GetMappedFrame(int64_t TargetFrameNumber) |
| 351 | { |
| 352 | // Check if mappings are dirty (and need to be recalculated) |
| 353 | if (is_dirty) |
| 354 | // Recalculate mappings |
| 355 | Init(); |
| 356 | |
| 357 | // Ignore mapping on single image readers |
| 358 | if (info.has_video and !info.has_audio and info.has_single_image) { |
| 359 | // Return the same number |
| 360 | MappedFrame frame; |
| 361 | frame.Even.Frame = TargetFrameNumber; |
| 362 | frame.Odd.Frame = TargetFrameNumber; |
| 363 | frame.Samples.frame_start = 0; |
| 364 | frame.Samples.frame_end = 0; |
| 365 | frame.Samples.sample_start = 0; |
| 366 | frame.Samples.sample_end = 0; |
| 367 | frame.Samples.total = 0; |
| 368 | return frame; |
| 369 | } |
| 370 | |
| 371 | // Check if frame number is valid |
| 372 | if(TargetFrameNumber < 1 || frames.size() == 0) |
| 373 | // frame too small, return error |
| 374 | throw OutOfBoundsFrame("An invalid frame was requested.", TargetFrameNumber, frames.size()); |
| 375 | |
| 376 | else if (TargetFrameNumber > (int64_t)frames.size()) |
| 377 | // frame too large, set to end frame |
| 378 | TargetFrameNumber = frames.size(); |
| 379 | |
| 380 | // Debug output |
| 381 | ZmqLogger::Instance()->AppendDebugMethod( |
| 382 | "FrameMapper::GetMappedFrame", |
| 383 | "TargetFrameNumber", TargetFrameNumber, |
| 384 | "frames.size()", frames.size(), |
| 385 | "frames[...].Odd", frames[TargetFrameNumber - 1].Odd.Frame, |
| 386 | "frames[...].Even", frames[TargetFrameNumber - 1].Even.Frame); |
| 387 | |
| 388 | // Return frame |
| 389 | return frames[TargetFrameNumber - 1]; |
| 390 | } |
| 391 | |
| 392 | // Get or generate a blank frame |
| 393 | std::shared_ptr<Frame> FrameMapper::GetOrCreateFrame(int64_t number) |
no test coverage detected