basevideoencoder: provide proper upstream flow return handling

This commit is contained in:
Mark Nauwelaerts 2011-03-24 14:10:07 +01:00
parent b7ae60f617
commit d15b8c7ad3
4 changed files with 17 additions and 15 deletions

View file

@ -150,7 +150,7 @@ static gboolean gst_dirac_enc_set_format (GstBaseVideoEncoder *
static gboolean gst_dirac_enc_start (GstBaseVideoEncoder * base_video_encoder); static gboolean gst_dirac_enc_start (GstBaseVideoEncoder * base_video_encoder);
static gboolean gst_dirac_enc_stop (GstBaseVideoEncoder * base_video_encoder); static gboolean gst_dirac_enc_stop (GstBaseVideoEncoder * base_video_encoder);
static gboolean gst_dirac_enc_finish (GstBaseVideoEncoder * base_video_encoder); static gboolean gst_dirac_enc_finish (GstBaseVideoEncoder * base_video_encoder);
static gboolean gst_dirac_enc_handle_frame (GstBaseVideoEncoder * static GstFlowReturn gst_dirac_enc_handle_frame (GstBaseVideoEncoder *
base_video_encoder, GstVideoFrame * frame); base_video_encoder, GstVideoFrame * frame);
static GstFlowReturn gst_dirac_enc_shape_output (GstBaseVideoEncoder * static GstFlowReturn gst_dirac_enc_shape_output (GstBaseVideoEncoder *
base_video_encoder, GstVideoFrame * frame); base_video_encoder, GstVideoFrame * frame);
@ -855,12 +855,12 @@ gst_dirac_enc_finish (GstBaseVideoEncoder * base_video_encoder)
return TRUE; return TRUE;
} }
static gboolean static GstFlowReturn
gst_dirac_enc_handle_frame (GstBaseVideoEncoder * base_video_encoder, gst_dirac_enc_handle_frame (GstBaseVideoEncoder * base_video_encoder,
GstVideoFrame * frame) GstVideoFrame * frame)
{ {
GstDiracEnc *dirac_enc = GST_DIRAC_ENC (base_video_encoder); GstDiracEnc *dirac_enc = GST_DIRAC_ENC (base_video_encoder);
gboolean ret; GstFlowReturn ret;
int r; int r;
const GstVideoState *state; const GstVideoState *state;
uint8_t *data; uint8_t *data;
@ -963,7 +963,7 @@ gst_dirac_enc_handle_frame (GstBaseVideoEncoder * base_video_encoder,
} }
if (r != (int) GST_BUFFER_SIZE (frame->sink_buffer)) { if (r != (int) GST_BUFFER_SIZE (frame->sink_buffer)) {
GST_ERROR ("failed to push picture"); GST_ERROR ("failed to push picture");
return FALSE; return GST_FLOW_ERROR;
} }
GST_DEBUG ("handle frame"); GST_DEBUG ("handle frame");
@ -976,7 +976,7 @@ gst_dirac_enc_handle_frame (GstBaseVideoEncoder * base_video_encoder,
ret = gst_dirac_enc_process (dirac_enc, FALSE); ret = gst_dirac_enc_process (dirac_enc, FALSE);
return (ret == GST_FLOW_OK); return ret;
} }
#if 0 #if 0

View file

@ -149,7 +149,7 @@ static gboolean gst_vp8_enc_stop (GstBaseVideoEncoder * encoder);
static gboolean gst_vp8_enc_set_format (GstBaseVideoEncoder * static gboolean gst_vp8_enc_set_format (GstBaseVideoEncoder *
base_video_encoder, GstVideoState * state); base_video_encoder, GstVideoState * state);
static gboolean gst_vp8_enc_finish (GstBaseVideoEncoder * base_video_encoder); static gboolean gst_vp8_enc_finish (GstBaseVideoEncoder * base_video_encoder);
static gboolean gst_vp8_enc_handle_frame (GstBaseVideoEncoder * static GstFlowReturn gst_vp8_enc_handle_frame (GstBaseVideoEncoder *
base_video_encoder, GstVideoFrame * frame); base_video_encoder, GstVideoFrame * frame);
static GstFlowReturn gst_vp8_enc_shape_output (GstBaseVideoEncoder * encoder, static GstFlowReturn gst_vp8_enc_shape_output (GstBaseVideoEncoder * encoder,
GstVideoFrame * frame); GstVideoFrame * frame);
@ -672,7 +672,7 @@ gst_vp8_enc_get_caps (GstBaseVideoEncoder * base_video_encoder)
return caps; return caps;
} }
static void static GstFlowReturn
gst_vp8_enc_process (GstVP8Enc * encoder) gst_vp8_enc_process (GstVP8Enc * encoder)
{ {
vpx_codec_iter_t iter = NULL; vpx_codec_iter_t iter = NULL;
@ -680,6 +680,7 @@ gst_vp8_enc_process (GstVP8Enc * encoder)
GstBaseVideoEncoder *base_video_encoder; GstBaseVideoEncoder *base_video_encoder;
GstVP8EncCoderHook *hook; GstVP8EncCoderHook *hook;
GstVideoFrame *frame; GstVideoFrame *frame;
GstFlowReturn ret = GST_FLOW_OK;
base_video_encoder = GST_BASE_VIDEO_ENCODER (encoder); base_video_encoder = GST_BASE_VIDEO_ENCODER (encoder);
@ -732,11 +733,13 @@ gst_vp8_enc_process (GstVP8Enc * encoder)
hook->invisible = g_list_append (hook->invisible, buffer); hook->invisible = g_list_append (hook->invisible, buffer);
} else { } else {
frame->src_buffer = buffer; frame->src_buffer = buffer;
gst_base_video_encoder_finish_frame (base_video_encoder, frame); ret = gst_base_video_encoder_finish_frame (base_video_encoder, frame);
} }
pkt = vpx_codec_get_cx_data (&encoder->encoder, &iter); pkt = vpx_codec_get_cx_data (&encoder->encoder, &iter);
} }
return ret;
} }
static gboolean static gboolean
@ -803,7 +806,7 @@ static const int speed_table[] = {
VPX_DL_REALTIME, VPX_DL_REALTIME,
}; };
static gboolean static GstFlowReturn
gst_vp8_enc_handle_frame (GstBaseVideoEncoder * base_video_encoder, gst_vp8_enc_handle_frame (GstBaseVideoEncoder * base_video_encoder,
GstVideoFrame * frame) GstVideoFrame * frame)
{ {
@ -845,9 +848,7 @@ gst_vp8_enc_handle_frame (GstBaseVideoEncoder * base_video_encoder,
return FALSE; return FALSE;
} }
gst_vp8_enc_process (encoder); return gst_vp8_enc_process (encoder);
return TRUE;
} }
static guint64 static guint64

View file

@ -492,6 +492,7 @@ gst_base_video_encoder_chain (GstPad * pad, GstBuffer * buf)
GstBaseVideoEncoder *base_video_encoder; GstBaseVideoEncoder *base_video_encoder;
GstBaseVideoEncoderClass *klass; GstBaseVideoEncoderClass *klass;
GstVideoFrame *frame; GstVideoFrame *frame;
GstFlowReturn ret = GST_FLOW_OK;
base_video_encoder = GST_BASE_VIDEO_ENCODER (gst_pad_get_parent (pad)); base_video_encoder = GST_BASE_VIDEO_ENCODER (gst_pad_get_parent (pad));
klass = GST_BASE_VIDEO_ENCODER_GET_CLASS (base_video_encoder); klass = GST_BASE_VIDEO_ENCODER_GET_CLASS (base_video_encoder);
@ -547,12 +548,12 @@ gst_base_video_encoder_chain (GstPad * pad, GstBuffer * buf)
GST_LOG_OBJECT (base_video_encoder, "passing frame pfn %d to subclass", GST_LOG_OBJECT (base_video_encoder, "passing frame pfn %d to subclass",
frame->presentation_frame_number); frame->presentation_frame_number);
klass->handle_frame (base_video_encoder, frame); ret = klass->handle_frame (base_video_encoder, frame);
done: done:
g_object_unref (base_video_encoder); g_object_unref (base_video_encoder);
return GST_FLOW_OK; return ret;
} }
static GstStateChangeReturn static GstStateChangeReturn

View file

@ -98,7 +98,7 @@ struct _GstBaseVideoEncoderClass
gboolean (*start) (GstBaseVideoEncoder *coder); gboolean (*start) (GstBaseVideoEncoder *coder);
gboolean (*stop) (GstBaseVideoEncoder *coder); gboolean (*stop) (GstBaseVideoEncoder *coder);
gboolean (*finish) (GstBaseVideoEncoder *coder); gboolean (*finish) (GstBaseVideoEncoder *coder);
gboolean (*handle_frame) (GstBaseVideoEncoder *coder, GstVideoFrame *frame); GstFlowReturn (*handle_frame) (GstBaseVideoEncoder *coder, GstVideoFrame *frame);
GstFlowReturn (*shape_output) (GstBaseVideoEncoder *coder, GstVideoFrame *frame); GstFlowReturn (*shape_output) (GstBaseVideoEncoder *coder, GstVideoFrame *frame);
gboolean (*event) (GstBaseVideoEncoder *coder, GstEvent *event); gboolean (*event) (GstBaseVideoEncoder *coder, GstEvent *event);
GstCaps *(*get_caps) (GstBaseVideoEncoder *coder); GstCaps *(*get_caps) (GstBaseVideoEncoder *coder);