diff --git a/gst-libs/gst/vaapi/gstvaapiencoder.c b/gst-libs/gst/vaapi/gstvaapiencoder.c index adb5b2cdb3..ddd2fc6cd1 100644 --- a/gst-libs/gst/vaapi/gstvaapiencoder.c +++ b/gst-libs/gst/vaapi/gstvaapiencoder.c @@ -208,7 +208,7 @@ gst_vaapi_encoder_free_sync_pictures (GstVaapiEncoder * encoder) GST_VAAPI_ENCODER_UNLOCK (encoder); } -static gboolean +static void gst_vaapi_encoder_push_sync_picture (GstVaapiEncoder * encoder, GstVaapiEncoderSyncPic * sync_pic) { @@ -216,7 +216,6 @@ gst_vaapi_encoder_push_sync_picture (GstVaapiEncoder * encoder, g_queue_push_tail (&encoder->sync_pictures, sync_pic); GST_VAAPI_ENCODER_SYNC_SIGNAL (encoder); GST_VAAPI_ENCODER_UNLOCK (encoder); - return TRUE; } static GstVaapiEncoderStatus @@ -233,7 +232,7 @@ gst_vaapi_encoder_pop_sync_picture (GstVaapiEncoder * encoder, goto timeout; if (g_queue_is_empty (&encoder->sync_pictures)) { - ret = GST_VAAPI_ENCODER_STATUS_UNKNOWN_ERR; + ret = GST_VAAPI_ENCODER_STATUS_ERROR_UNKNOWN; goto end; } @@ -244,7 +243,7 @@ gst_vaapi_encoder_pop_sync_picture (GstVaapiEncoder * encoder, goto end; timeout: - ret = GST_VAAPI_ENCODER_STATUS_TIMEOUT; + ret = GST_VAAPI_ENCODER_STATUS_NO_BUFFER; end: GST_VAAPI_ENCODER_UNLOCK (encoder); @@ -265,21 +264,14 @@ again: picture = NULL; sync_pic = NULL; ret = klass->reordering (encoder, frame, FALSE, &picture); - - if (ret == GST_VAAPI_ENCODER_STATUS_FRAME_NOT_READY) + if (ret == GST_VAAPI_ENCODER_STATUS_NO_SURFACE) return GST_VAAPI_ENCODER_STATUS_SUCCESS; - - g_assert (picture); if (ret != GST_VAAPI_ENCODER_STATUS_SUCCESS) goto error; - if (!picture) { - ret = GST_VAAPI_ENCODER_STATUS_PICTURE_ERR; - goto error; - } coded_buf = gst_vaapi_encoder_create_coded_buffer (encoder); if (!coded_buf) { - ret = GST_VAAPI_ENCODER_STATUS_OBJECT_ERR; + ret = GST_VAAPI_ENCODER_STATUS_ERROR_ALLOCATION_FAILED; goto error; } @@ -291,11 +283,7 @@ again: sync_pic = _create_sync_picture (picture, coded_buf); gst_vaapi_coded_buffer_proxy_replace (&coded_buf, NULL); gst_vaapi_enc_picture_replace (&picture, NULL); - - if (!gst_vaapi_encoder_push_sync_picture (encoder, sync_pic)) { - ret = GST_VAAPI_ENCODER_STATUS_THREAD_ERR; - goto error; - } + gst_vaapi_encoder_push_sync_picture (encoder, sync_pic); frame = NULL; goto again; @@ -326,11 +314,11 @@ gst_vaapi_encoder_get_buffer (GstVaapiEncoder * encoder, picture = sync_pic->picture; if (!picture->surface || !gst_vaapi_surface_sync (picture->surface)) { - ret = GST_VAAPI_ENCODER_STATUS_PARAM_ERR; + ret = GST_VAAPI_ENCODER_STATUS_ERROR_INVALID_PARAMETER; goto end; } if (!gst_vaapi_surface_query_status (picture->surface, &surface_status)) { - ret = GST_VAAPI_ENCODER_STATUS_PICTURE_ERR; + ret = GST_VAAPI_ENCODER_STATUS_ERROR_INVALID_SURFACE; goto end; } if (frame) diff --git a/gst-libs/gst/vaapi/gstvaapiencoder.h b/gst-libs/gst/vaapi/gstvaapiencoder.h index 8741c9a752..99223662ca 100644 --- a/gst-libs/gst/vaapi/gstvaapiencoder.h +++ b/gst-libs/gst/vaapi/gstvaapiencoder.h @@ -27,23 +27,32 @@ G_BEGIN_DECLS +/** + * GstVaapiEncoderStatus: + * @GST_VAAPI_ENCODER_STATUS_SUCCESS: Success. + * @GST_VAAPI_ENCODER_STATUS_ERROR_NO_SURFACE: No surface left to encode. + * @GST_VAAPI_ENCODER_STATUS_ERROR_NO_BUFFER: No coded buffer left to hold the encoded picture. + * @GST_VAAPI_ENCODER_STATUS_ERROR_UNKNOWN: Unknown error. + * @GST_VAAPI_ENCODER_STATUS_ERROR_ALLOCATION_FAILED: No memory left. + * @GST_VAAPI_ENCODER_STATUS_ERROR_INVALID_PARAMETER: Invalid parameter. + * @GST_VAAPI_ENCODER_STATUS_ERROR_INVALID_BUFFER: Invalid buffer. + * @GST_VAAPI_ENCODER_STATUS_ERROR_INVALID_SURFACE: Invalid surface. + * @GST_VAAPI_ENCODER_STATUS_ERROR_INVALID_HEADER: Invalid header. + * + * Set of #GstVaapiEncoder status codes. + */ typedef enum { GST_VAAPI_ENCODER_STATUS_SUCCESS = 0, - GST_VAAPI_ENCODER_STATUS_FRAME_NOT_READY = 1, - GST_VAAPI_ENCODER_STATUS_NO_DATA = 2, - GST_VAAPI_ENCODER_STATUS_TIMEOUT = 3, - GST_VAAPI_ENCODER_STATUS_NOT_READY = 4, - GST_VAAPI_ENCODER_STATUS_FRAME_IN_ORDER = 5, + GST_VAAPI_ENCODER_STATUS_NO_SURFACE = 1, + GST_VAAPI_ENCODER_STATUS_NO_BUFFER = 2, - GST_VAAPI_ENCODER_STATUS_PARAM_ERR = -1, - GST_VAAPI_ENCODER_STATUS_OBJECT_ERR = -2, - GST_VAAPI_ENCODER_STATUS_PICTURE_ERR = -3, - GST_VAAPI_ENCODER_STATUS_THREAD_ERR = -4, - GST_VAAPI_ENCODER_STATUS_PROFILE_ERR = -5, - GST_VAAPI_ENCODER_STATUS_FUNC_PTR_ERR = -6, - GST_VAAPI_ENCODER_STATUS_MEM_ERROR = -7, - GST_VAAPI_ENCODER_STATUS_UNKNOWN_ERR = -8, + GST_VAAPI_ENCODER_STATUS_ERROR_UNKNOWN = -1, + GST_VAAPI_ENCODER_STATUS_ERROR_ALLOCATION_FAILED = -2, + GST_VAAPI_ENCODER_STATUS_ERROR_INVALID_PARAMETER = -100, + GST_VAAPI_ENCODER_STATUS_ERROR_INVALID_BUFFER = -101, + GST_VAAPI_ENCODER_STATUS_ERROR_INVALID_SURFACE = -102, + GST_VAAPI_ENCODER_STATUS_ERROR_INVALID_HEADER = -103, } GstVaapiEncoderStatus; typedef struct _GstVaapiEncoder GstVaapiEncoder; diff --git a/gst-libs/gst/vaapi/gstvaapiencoder_h264.c b/gst-libs/gst/vaapi/gstvaapiencoder_h264.c index 01546dafba..28d948acc7 100644 --- a/gst-libs/gst/vaapi/gstvaapiencoder_h264.c +++ b/gst-libs/gst/vaapi/gstvaapiencoder_h264.c @@ -1350,7 +1350,7 @@ gst_vaapi_encoder_h264_encode (GstVaapiEncoder * base, GstVaapiEncPicture * picture, GstVaapiCodedBufferProxy * codedbuf) { GstVaapiEncoderH264 *encoder = GST_VAAPI_ENCODER_H264_CAST (base); - GstVaapiEncoderStatus ret = GST_VAAPI_ENCODER_STATUS_UNKNOWN_ERR; + GstVaapiEncoderStatus ret = GST_VAAPI_ENCODER_STATUS_ERROR_UNKNOWN; GstVaapiSurfaceProxy *reconstruct = NULL; reconstruct = gst_vaapi_encoder_create_surface (base); @@ -1412,19 +1412,19 @@ gst_vaapi_encoder_h264_get_avcC_codec_data (GstVaapiEncoderH264 * encoder, g_assert (buffer); if (!encoder->sps_data || !encoder->pps_data) - return GST_VAAPI_ENCODER_STATUS_NOT_READY; + return GST_VAAPI_ENCODER_STATUS_ERROR_INVALID_HEADER; if (!gst_buffer_map (encoder->sps_data, &sps_info, GST_MAP_READ)) - return GST_VAAPI_ENCODER_STATUS_MEM_ERROR; + return GST_VAAPI_ENCODER_STATUS_ERROR_ALLOCATION_FAILED; if (FALSE == _read_sps_attributes (sps_info.data, sps_info.size, &profile, &profile_comp, &level_idc)) { - ret = GST_VAAPI_ENCODER_STATUS_UNKNOWN_ERR; + ret = GST_VAAPI_ENCODER_STATUS_ERROR_INVALID_HEADER; goto end; } if (!gst_buffer_map (encoder->pps_data, &pps_info, GST_MAP_READ)) { - ret = GST_VAAPI_ENCODER_STATUS_MEM_ERROR; + ret = GST_VAAPI_ENCODER_STATUS_ERROR_ALLOCATION_FAILED; goto end; } @@ -1453,7 +1453,7 @@ gst_vaapi_encoder_h264_get_avcC_codec_data (GstVaapiEncoderH264 * encoder, GST_BIT_WRITER_BIT_SIZE (&writer) / 8); g_assert (avc_codec); if (!avc_codec) { - ret = GST_VAAPI_ENCODER_STATUS_MEM_ERROR; + ret = GST_VAAPI_ENCODER_STATUS_ERROR_ALLOCATION_FAILED; goto clear_writer; } *buffer = avc_codec; @@ -1498,13 +1498,13 @@ gst_vaapi_encoder_h264_reordering (GstVaapiEncoder * base, if (!frame) { if (encoder->reorder_state != GST_VAAPI_ENC_H264_REORD_DUMP_FRAMES) - return GST_VAAPI_ENCODER_STATUS_FRAME_NOT_READY; + return GST_VAAPI_ENCODER_STATUS_NO_SURFACE; /* reorder_state = GST_VAAPI_ENC_H264_REORD_DUMP_FRAMES dump B frames from queue, sometime, there may also have P frame or I frame */ g_assert (encoder->b_frame_num > 0); g_return_val_if_fail (!g_queue_is_empty (&encoder->reorder_frame_list), - GST_VAAPI_ENCODER_STATUS_UNKNOWN_ERR); + GST_VAAPI_ENCODER_STATUS_ERROR_UNKNOWN); picture = g_queue_pop_head (&encoder->reorder_frame_list); g_assert (picture); if (g_queue_is_empty (&encoder->reorder_frame_list)) { @@ -1518,7 +1518,7 @@ gst_vaapi_encoder_h264_reordering (GstVaapiEncoder * base, if (!picture) { GST_WARNING ("create H264 picture failed, frame timestamp:%" GST_TIME_FORMAT, GST_TIME_ARGS (frame->pts)); - return GST_VAAPI_ENCODER_STATUS_OBJECT_ERR; + return GST_VAAPI_ENCODER_STATUS_ERROR_ALLOCATION_FAILED; } ++encoder->cur_present_index; picture->poc = ((encoder->cur_present_index * 2) % @@ -1562,7 +1562,7 @@ gst_vaapi_encoder_h264_reordering (GstVaapiEncoder * base, g_queue_get_length (&encoder->reorder_frame_list) < encoder->b_frame_num) { g_queue_push_tail (&encoder->reorder_frame_list, picture); - return GST_VAAPI_ENCODER_STATUS_FRAME_NOT_READY; + return GST_VAAPI_ENCODER_STATUS_NO_SURFACE; } ++encoder->cur_frame_num; diff --git a/gst-libs/gst/vaapi/gstvaapiencoder_mpeg2.c b/gst-libs/gst/vaapi/gstvaapiencoder_mpeg2.c index 10de5875f6..ec8d575be3 100644 --- a/gst-libs/gst/vaapi/gstvaapiencoder_mpeg2.c +++ b/gst-libs/gst/vaapi/gstvaapiencoder_mpeg2.c @@ -501,7 +501,7 @@ gst_vaapi_encoder_mpeg2_encode (GstVaapiEncoder * base, GstVaapiEncPicture * picture, GstVaapiCodedBufferProxy * codedbuf) { GstVaapiEncoderMpeg2 *encoder = GST_VAAPI_ENCODER_MPEG2_CAST (base); - GstVaapiEncoderStatus ret = GST_VAAPI_ENCODER_STATUS_UNKNOWN_ERR; + GstVaapiEncoderStatus ret = GST_VAAPI_ENCODER_STATUS_ERROR_UNKNOWN; GstVaapiSurfaceProxy *reconstruct = NULL; reconstruct = gst_vaapi_encoder_create_surface (base); @@ -564,7 +564,7 @@ gst_vaapi_encoder_mpeg2_reordering (GstVaapiEncoder * base, encoder->dump_frames = FALSE; } if (!encoder->dump_frames) { - return GST_VAAPI_ENCODER_STATUS_FRAME_NOT_READY; + return GST_VAAPI_ENCODER_STATUS_NO_SURFACE; } picture = g_queue_pop_head (&encoder->b_frames); g_assert (picture); @@ -575,7 +575,7 @@ gst_vaapi_encoder_mpeg2_reordering (GstVaapiEncoder * base, if (!picture) { GST_WARNING ("create MPEG2 picture failed, frame timestamp:%" GST_TIME_FORMAT, GST_TIME_ARGS (frame->pts)); - return GST_VAAPI_ENCODER_STATUS_OBJECT_ERR; + return GST_VAAPI_ENCODER_STATUS_ERROR_ALLOCATION_FAILED; } if (encoder->frame_num >= encoder->intra_period) { @@ -594,7 +594,7 @@ gst_vaapi_encoder_mpeg2_reordering (GstVaapiEncoder * base, encoder->dump_frames = TRUE; } else { picture->type = GST_VAAPI_PICTURE_TYPE_B; - status = GST_VAAPI_ENCODER_STATUS_FRAME_NOT_READY; + status = GST_VAAPI_ENCODER_STATUS_NO_SURFACE; } } diff --git a/gst/vaapi/gstvaapiencode.c b/gst/vaapi/gstvaapiencode.c index adb24741f1..308aecf53b 100644 --- a/gst/vaapi/gstvaapiencode.c +++ b/gst/vaapi/gstvaapiencode.c @@ -231,7 +231,7 @@ gst_vaapiencode_push_frame (GstVaapiEncode * encode, gint64 timeout) status = gst_vaapi_encoder_get_buffer (encode->encoder, &out_frame, &codedbuf_proxy, timeout); - if (status == GST_VAAPI_ENCODER_STATUS_TIMEOUT) + if (status == GST_VAAPI_ENCODER_STATUS_NO_BUFFER) return GST_VAAPI_ENCODE_FLOW_TIMEOUT; if (status != GST_VAAPI_ENCODER_STATUS_SUCCESS) goto error_get_buffer;