static GstVaapiEncoderStatus gst_vaapi_encoder_vp8_reordering (GstVaapiEncoder * base_encoder, GstVideoCodecFrame * frame, GstVaapiEncPicture ** output) { GstVaapiEncoderVP8 *const encoder = GST_VAAPI_ENCODER_VP8_CAST (base_encoder); GstVaapiEncPicture *picture = NULL; GstVaapiEncoderStatus status = GST_VAAPI_ENCODER_STATUS_SUCCESS; if (!frame) return GST_VAAPI_ENCODER_STATUS_NO_SURFACE; picture = GST_VAAPI_ENC_PICTURE_NEW (VP8, encoder, frame); if (!picture) { GST_WARNING ("create VP8 picture failed, frame timestamp:%" GST_TIME_FORMAT, GST_TIME_ARGS (frame->pts)); return GST_VAAPI_ENCODER_STATUS_ERROR_ALLOCATION_FAILED; } if (encoder->frame_num >= base_encoder->keyframe_period) { encoder->frame_num = 0; clear_references (encoder); } if (encoder->frame_num == 0) { picture->type = GST_VAAPI_PICTURE_TYPE_I; GST_VIDEO_CODEC_FRAME_SET_SYNC_POINT (frame); } else { picture->type = GST_VAAPI_PICTURE_TYPE_P; } encoder->frame_num++; *output = picture; return status; }
static GstVaapiEncoderStatus gst_vaapi_encoder_mpeg2_reordering (GstVaapiEncoder * base_encoder, GstVideoCodecFrame * frame, GstVaapiEncPicture ** output) { GstVaapiEncoderMpeg2 *const encoder = GST_VAAPI_ENCODER_MPEG2_CAST (base_encoder); GstVaapiEncPicture *picture = NULL; GstVaapiEncoderStatus status = GST_VAAPI_ENCODER_STATUS_SUCCESS; if (!frame) { if (g_queue_is_empty (&encoder->b_frames) && encoder->dump_frames) { push_reference (encoder, NULL); encoder->dump_frames = FALSE; } if (!encoder->dump_frames) { return GST_VAAPI_ENCODER_STATUS_NO_SURFACE; } picture = g_queue_pop_head (&encoder->b_frames); g_assert (picture); goto end; } picture = GST_VAAPI_ENC_PICTURE_NEW (MPEG2, encoder, frame); if (!picture) { GST_WARNING ("create MPEG2 picture failed, frame timestamp:%" GST_TIME_FORMAT, GST_TIME_ARGS (frame->pts)); return GST_VAAPI_ENCODER_STATUS_ERROR_ALLOCATION_FAILED; } if (encoder->frame_num >= base_encoder->keyframe_period) { encoder->frame_num = 0; clear_references (encoder); } if (encoder->frame_num == 0) { picture->type = GST_VAAPI_PICTURE_TYPE_I; GST_VIDEO_CODEC_FRAME_SET_SYNC_POINT (frame); encoder->new_gop = TRUE; } else { encoder->new_gop = FALSE; if ((encoder->frame_num % (encoder->ip_period + 1)) == 0 || encoder->frame_num == base_encoder->keyframe_period - 1) { picture->type = GST_VAAPI_PICTURE_TYPE_P; encoder->dump_frames = TRUE; } else { picture->type = GST_VAAPI_PICTURE_TYPE_B; status = GST_VAAPI_ENCODER_STATUS_NO_SURFACE; } } picture->frame_num = encoder->frame_num++; if (picture->type == GST_VAAPI_PICTURE_TYPE_B) { g_queue_push_tail (&encoder->b_frames, picture); picture = NULL; } end: *output = picture; return status; }
static GstVaapiEncoderStatus gst_vaapi_encoder_jpeg_reordering (GstVaapiEncoder * base_encoder, GstVideoCodecFrame * frame, GstVaapiEncPicture ** output) { GstVaapiEncoderJpeg *const encoder = GST_VAAPI_ENCODER_JPEG_CAST (base_encoder); GstVaapiEncPicture *picture = NULL; GstVaapiEncoderStatus status = GST_VAAPI_ENCODER_STATUS_SUCCESS; if (!frame) return GST_VAAPI_ENCODER_STATUS_NO_SURFACE; picture = GST_VAAPI_ENC_PICTURE_NEW (JPEG, encoder, frame); if (!picture) { GST_WARNING ("create JPEG picture failed, frame timestamp:%" GST_TIME_FORMAT, GST_TIME_ARGS (frame->pts)); return GST_VAAPI_ENCODER_STATUS_ERROR_ALLOCATION_FAILED; } *output = picture; return status; }