MayaFlux 1.0.0
Digital-First Multimedia Processing Framework
Loading...
Searching...
No Matches

◆ extract_keyframe_regions()

std::vector< FileRegion > MayaFlux::IO::VideoStreamContext::extract_keyframe_regions ( const FFmpegDemuxContext &  demux) const

Extract keyframe positions as FileRegion entries.

Parameters
demuxThe demux context.
Returns
Vector of FileRegion with type="keyframe".

Definition at line 440 of file VideoStreamContext.cpp.

442{
443 std::vector<FileRegion> regions;
444 if (stream_index < 0 || !codec_context)
445 return regions;
446
447 AVStream* stream = demux.get_stream(stream_index);
448 if (!stream)
449 return regions;
450
451 AVPacket* pkt = av_packet_alloc();
452 if (!pkt)
453 return regions;
454
455 int idx = 0;
456 while (av_read_frame(demux.format_context, pkt) >= 0) {
457 if (pkt->stream_index == stream_index && (pkt->flags & AV_PKT_FLAG_KEY)) {
458 FileRegion r;
459 r.type = "keyframe";
460 r.name = "keyframe_" + std::to_string(idx);
461
462 int64_t pts = pkt->pts != AV_NOPTS_VALUE ? pkt->pts : pkt->dts;
463 double ts = 0.0;
464 if (pts != AV_NOPTS_VALUE && stream->time_base.num > 0 && stream->time_base.den > 0)
465 ts = static_cast<double>(pts) * av_q2d(stream->time_base);
466
467 uint64_t frame_pos = 0;
468 if (frame_rate > 0.0)
469 frame_pos = static_cast<uint64_t>(ts * frame_rate);
470
471 r.start_coordinates = { frame_pos };
472 r.end_coordinates = { frame_pos };
473 r.attributes["pts"] = pts;
474 r.attributes["timestamp_seconds"] = ts;
475 r.attributes["keyframe_index"] = idx;
476
477 regions.push_back(std::move(r));
478 ++idx;
479 }
480 av_packet_unref(pkt);
481 }
482
483 av_packet_free(&pkt);
484
485 av_seek_frame(demux.format_context, stream_index, 0, AVSEEK_FLAG_BACKWARD);
486
487 return regions;
488}
Core::GlobalStreamInfo stream
Definition Config.cpp:40
double frame_rate
Average frame rate (fps).
AVCodecContext * codec_context
Owned; freed in destructor.

References MayaFlux::IO::FileRegion::attributes, codec_context, MayaFlux::IO::FileRegion::end_coordinates, MayaFlux::IO::FFmpegDemuxContext::format_context, frame_rate, MayaFlux::IO::FFmpegDemuxContext::get_stream(), MayaFlux::IO::FileRegion::name, MayaFlux::IO::FileRegion::start_coordinates, stream, stream_index, and MayaFlux::IO::FileRegion::type.

+ Here is the call graph for this function: