static void handle_simpleblock(KaxSimpleBlock &simpleblock, KaxCluster &cluster) { if (0 == simpleblock.NumberFrames()) return; simpleblock.SetParent(cluster); std::vector<timecode_extractor_t>::iterator extractor = find_extractor_by_track_number(simpleblock.TrackNum()); if (timecode_extractors.end() == extractor) return; // Pass the block to the extractor. size_t i; for (i = 0; simpleblock.NumberFrames() > i; ++i) extractor->m_timecodes.push_back(timecode_t(simpleblock.GlobalTimecode() + i * extractor->m_default_duration, extractor->m_default_duration)); }
static int64_t handle_simpleblock(KaxSimpleBlock &simpleblock, KaxCluster &cluster) { if (0 == simpleblock.NumberFrames()) return - 1; simpleblock.SetParent(cluster); // Do we need this block group? xtr_base_c *extractor = nullptr; size_t i; for (i = 0; i < extractors.size(); i++) if (simpleblock.TrackNum() == extractors[i]->m_track_num) { extractor = extractors[i]; break; } if (!extractor) return - 1; int64_t duration = extractor->m_default_duration * simpleblock.NumberFrames(); int64_t max_timecode = 0; for (i = 0; i < simpleblock.NumberFrames(); i++) { int64_t this_timecode, this_duration; if (0 > duration) { this_timecode = simpleblock.GlobalTimecode(); this_duration = duration; } else { this_timecode = simpleblock.GlobalTimecode() + i * duration / simpleblock.NumberFrames(); this_duration = duration / simpleblock.NumberFrames(); } auto &data = simpleblock.GetBuffer(i); auto frame = std::make_shared<memory_c>(data.Buffer(), data.Size(), false); auto f = xtr_frame_t{frame, nullptr, this_timecode, this_duration, -1, -1, simpleblock.IsKeyframe(), simpleblock.IsDiscardable(), false, timecode_c::ns(0)}; extractor->decode_and_handle_frame(f); max_timecode = std::max(max_timecode, this_timecode); } return max_timecode; }
static void handle_simpleblock_timestamps(KaxSimpleBlock &simpleblock) { auto itr = timestamp_extractors.find(simpleblock.TrackNum()); if (timestamp_extractors.end() == itr) return; // Pass the block to the extractor. auto &extractor = *itr->second; for (auto idx = 0u, end = simpleblock.NumberFrames(); idx < end; ++idx) extractor.m_timestamps.emplace_back(simpleblock.GlobalTimecode() + idx * extractor.m_default_duration, extractor.m_default_duration); }
static int64_t handle_simpleblock(KaxSimpleBlock &simpleblock, KaxCluster &cluster) { if (0 == simpleblock.NumberFrames()) return -1; simpleblock.SetParent(cluster); handle_simpleblock_timestamps(simpleblock); // Do we need this block group? auto extractor_itr = track_extractors_by_track_number.find(simpleblock.TrackNum()); if (extractor_itr == track_extractors_by_track_number.end()) return - 1; auto &extractor = *extractor_itr->second; int64_t duration = extractor.m_default_duration * simpleblock.NumberFrames(); int64_t max_timestamp = 0; for (int i = 0, num_frames = simpleblock.NumberFrames(); i < num_frames; i++) { int64_t this_timestamp, this_duration; if (0 > duration) { this_timestamp = simpleblock.GlobalTimecode(); this_duration = duration; } else { this_timestamp = simpleblock.GlobalTimecode() + i * duration / simpleblock.NumberFrames(); this_duration = duration / simpleblock.NumberFrames(); } auto &data = simpleblock.GetBuffer(i); auto frame = std::make_shared<memory_c>(data.Buffer(), data.Size(), false); auto f = xtr_frame_t{frame, nullptr, this_timestamp, this_duration, -1, -1, simpleblock.IsKeyframe(), simpleblock.IsDiscardable(), false, timestamp_c::ns(0)}; extractor.decode_and_handle_frame(f); max_timestamp = std::max(max_timestamp, this_timestamp); } return max_timestamp; }
static void handle_simpleblock(KaxSimpleBlock &simpleblock, KaxCluster &cluster) { if (0 == simpleblock.NumberFrames()) return; simpleblock.SetParent(cluster); // Do we need this block group? xtr_base_c *extractor = NULL; size_t i; for (i = 0; i < extractors.size(); i++) if (simpleblock.TrackNum() == extractors[i]->m_track_num) { extractor = extractors[i]; break; } if (NULL == extractor) return; int64_t duration = extractor->m_default_duration * simpleblock.NumberFrames(); for (i = 0; i < simpleblock.NumberFrames(); i++) { int64_t this_timecode, this_duration; if (0 > duration) { this_timecode = simpleblock.GlobalTimecode(); this_duration = duration; } else { this_timecode = simpleblock.GlobalTimecode() + i * duration / simpleblock.NumberFrames(); this_duration = duration / simpleblock.NumberFrames(); } DataBuffer &data = simpleblock.GetBuffer(i); memory_cptr frame(new memory_c(data.Buffer(), data.Size(), false)); extractor->handle_frame(frame, NULL, this_timecode, this_duration, -1, -1, simpleblock.IsKeyframe(), simpleblock.IsDiscardable(), false); } }
void tag_target_c::account_simple_block(KaxSimpleBlock &simple_block, KaxCluster &cluster) { auto num_frames = simple_block.NumberFrames(); auto stats_itr = m_track_statistics_by_number.find(simple_block.TrackNum()); if (!num_frames || (stats_itr == m_track_statistics_by_number.end())) return; simple_block.SetParent(cluster); auto frame_duration = m_default_durations_by_number[simple_block.TrackNum()]; auto first_timestamp = simple_block.GlobalTimecode(); for (int idx = 0; idx < static_cast<int>(num_frames); ++idx) { auto &data_buffer = simple_block.GetBuffer(idx); stats_itr->second.account(first_timestamp + idx * frame_duration, frame_duration, data_buffer.Size()); } }