MayaFlux 0.5.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 439 of file VideoStreamContext.cpp.

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