MayaFlux 0.2.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 434 of file VideoStreamContext.cpp.

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

+ Here is the call graph for this function: