|
|
|
@ -51,8 +51,6 @@ swap_frames(AVFrame **lhs, AVFrame **rhs) {
|
|
|
|
bool
|
|
|
|
bool
|
|
|
|
sc_frame_buffer_push(struct sc_frame_buffer *fb, const AVFrame *frame,
|
|
|
|
sc_frame_buffer_push(struct sc_frame_buffer *fb, const AVFrame *frame,
|
|
|
|
bool *previous_frame_skipped) {
|
|
|
|
bool *previous_frame_skipped) {
|
|
|
|
sc_mutex_lock(&fb->mutex);
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
// Use a temporary frame to preserve pending_frame in case of error.
|
|
|
|
// Use a temporary frame to preserve pending_frame in case of error.
|
|
|
|
// tmp_frame is an empty frame, no need to call av_frame_unref() beforehand.
|
|
|
|
// tmp_frame is an empty frame, no need to call av_frame_unref() beforehand.
|
|
|
|
int r = av_frame_ref(fb->tmp_frame, frame);
|
|
|
|
int r = av_frame_ref(fb->tmp_frame, frame);
|
|
|
|
@ -61,6 +59,8 @@ sc_frame_buffer_push(struct sc_frame_buffer *fb, const AVFrame *frame,
|
|
|
|
return false;
|
|
|
|
return false;
|
|
|
|
}
|
|
|
|
}
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
sc_mutex_lock(&fb->mutex);
|
|
|
|
|
|
|
|
|
|
|
|
// Now that av_frame_ref() succeeded, we can replace the previous
|
|
|
|
// Now that av_frame_ref() succeeded, we can replace the previous
|
|
|
|
// pending_frame
|
|
|
|
// pending_frame
|
|
|
|
swap_frames(&fb->pending_frame, &fb->tmp_frame);
|
|
|
|
swap_frames(&fb->pending_frame, &fb->tmp_frame);
|
|
|
|
|