mirror of
https://github.com/obsproject/obs-studio.git
synced 2024-09-20 04:42:18 +02:00
07d504e5c7
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
27 lines
799 B
C
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
|