#ifndef STREAM_H #define STREAM_H #include "common.h" typedef enum { SS_IDLE=0, SS_LIVE, SS_PUSHING, SS_ERROR } StreamState; typedef struct { int used; int id; int channel; char session_id[64]; char rtmp_url[MAX_PATH_SIZE]; StreamState state; uint64_t frames; uint64_t bytes_pushed; int64_t start_ms; /* PS encapsulation scratch */ uint8_t ps_buf[MAX_BUF_SIZE]; size_t ps_len; uint64_t pts_base; uint64_t dts_base; pthread_mutex_t lock; } StreamSession; int stream_init(void); int stream_start_listen(void); int stream_stop_listen(void); int stream_open(int channel, const char*rtmp_url, int*out_id); int stream_push_frame(int id, const uint8_t*nalu, size_t n, uint64_t pts_ms, uint64_t dts_ms, int keyframe); int stream_close(int id); int stream_find_by_channel(int channel); StreamSession* stream_get_session(int id); void stream_stats(int*active, uint64_t*total_frames, uint64_t*total_bytes); void stream_cleanup(void); /* PS -> live helper used by main simulate loop & self test */ int stream_simulate_loop(int channel, int frames); #endif