X-Git-Url: https://git.sesse.net/?a=blobdiff_plain;f=video_encoder.cpp;h=e00465c25a67b8b72e364e39ae29db897c1c76c3;hb=e066f18188fde1e6bd0b698c89427119cbffaaa3;hp=c817283690503b8bea94131b1328d13b48c3265d;hpb=cf7b9ee186d4ef8e5da0531b75854c97b821be44;p=nageru diff --git a/video_encoder.cpp b/video_encoder.cpp index c817283..e00465c 100644 --- a/video_encoder.cpp +++ b/video_encoder.cpp @@ -120,17 +120,17 @@ void VideoEncoder::add_audio(int64_t pts, std::vector audio) stream_audio_encoder->encode_audio(audio, pts + quicksync_encoder->global_delay()); } -bool VideoEncoder::begin_frame(GLuint *y_tex, GLuint *cbcr_tex) +bool VideoEncoder::begin_frame(int64_t pts, int64_t duration, const std::vector &input_frames, GLuint *y_tex, GLuint *cbcr_tex) { lock_guard lock(qs_mu); qs_needing_cleanup.clear(); // Since we have an OpenGL context here, and are called regularly. - return quicksync_encoder->begin_frame(y_tex, cbcr_tex); + return quicksync_encoder->begin_frame(pts, duration, input_frames, y_tex, cbcr_tex); } -RefCountedGLsync VideoEncoder::end_frame(int64_t pts, int64_t duration, const std::vector &input_frames) +RefCountedGLsync VideoEncoder::end_frame() { lock_guard lock(qs_mu); - return quicksync_encoder->end_frame(pts, duration, input_frames); + return quicksync_encoder->end_frame(); } void VideoEncoder::open_output_stream() @@ -170,6 +170,14 @@ int VideoEncoder::write_packet2_thunk(void *opaque, uint8_t *buf, int buf_size, int VideoEncoder::write_packet2(uint8_t *buf, int buf_size, AVIODataMarkerType type, int64_t time) { + if (type == AVIO_DATA_MARKER_SYNC_POINT || type == AVIO_DATA_MARKER_BOUNDARY_POINT) { + seen_sync_markers = true; + } else if (type == AVIO_DATA_MARKER_UNKNOWN && !seen_sync_markers) { + // We don't know if this is a keyframe or not (the muxer could + // avoid marking it), so we just have to make the best of it. + type = AVIO_DATA_MARKER_SYNC_POINT; + } + if (type == AVIO_DATA_MARKER_HEADER) { stream_mux_header.append((char *)buf, buf_size); httpd->set_header(stream_mux_header);