0
0
mirror of https://github.com/obsproject/obs-studio.git synced 2024-09-20 04:42:18 +02:00
obs-studio/shared/bpm/bpm.h
Alex Luccisano 07d504e5c7 shared/bpm: Add BPM (Broadcast Performance Metrics)
Introduce support for delivering BPM (Broadcast
Performance Metrics) over SEI (for AVC/H.264 and
HEVC/H.265) and OBU (for AV1) unregistered messages.
Metrics being sent are the session frame counters,
per-rendition frame counters, and RFC3339-based
timestamping information to support end-to-end
latency measurement.

SEI/OBU messages are generated and sent with each IDR
frame, and the frame counters are diff-based, meaning
the counts reflect the diff between IDRs, not the running
totals.

BPM documentation is available at [1].

BPM relies on the recently introduced encoder packet timing
support and the packet callback mechanism.

BPM injection is enabled for an output by registering
the `bpm_inject()` callback via `obs_output_add_packet_callback()`
function. The callback must be unregistered using
`obs_output_remove_packet_callback()` and `bpm_destroy()`
must be used by the caller to release the BPM structures.

It is important to measure the number of frames successfully
encoded by the obs_encoder_t instances, particularly for
renditions where the encoded frame rate differs from the
canvas frame rate. The encoded_frames counter and
`obs_encoder_get_encoded_frames()` API is introduced
to measure and report this in the encoded rendition
metrics message.

[1] https://d50yg09cghihd.cloudfront.net/other/20240718-MultitrackVideoIntegrationGuide.pdf
2024-09-05 16:38:58 -04:00

27 lines
799 B
C

#ifndef BPM_H
#define BPM_H
#ifdef __cplusplus
extern "C" {
#endif
/* BPM callback. Allocation of BPM metrics data happens automatically
* with the first invokation of the callback associated with the output.
* Deallocation must be done explicitly with bpm_destroy(), after the
* callback is removed.
*
* BPM is designed to operate at the packet level. The bpm_inject()
* callback function must be registered and unregistered with
* obs_output_add_packet_callback() and obs_output_remove_packet_callback(),
* respectively.
*/
void bpm_inject(obs_output_t *output, struct encoder_packet *pkt,
struct encoder_packet_time *pkt_time, void *param);
/* BPM function to destroy all allocations for a given output. */
void bpm_destroy(obs_output_t *output);
#ifdef __cplusplus
}
#endif
#endif