/* GStreamer Intel MSDK plugin * Copyright (c) 2016, Oblong Industries, Inc. * All rights reserved. * * Redistribution and use in source and binary forms, with or without * modification, are permitted provided that the following conditions are met: * * 1. Redistributions of source code must retain the above copyright notice, * this list of conditions and the following disclaimer. * * 2. Redistributions in binary form must reproduce the above copyright notice, * this list of conditions and the following disclaimer in the documentation * and/or other materials provided with the distribution. * * 3. Neither the name of the copyright holder nor the names of its contributors * may be used to endorse or promote products derived from this software * without specific prior written permission. * * THIS SOFTWARE IS PROVIDED BY THE COPYRIGHT HOLDERS AND CONTRIBUTORS "AS IS" * AND ANY EXPRESS OR IMPLIED WARRANTIES, INCLUDING, BUT NOT LIMITED TO, * THE IMPLIED WARRANTIES OF MERCHANTABILITY AND FITNESS FOR A PARTICULAR * PURPOSE ARE DISCLAIMED. IN NO EVENT SHALL THE COPYRIGHT HOLDER OR * CONTRIBUTORS BE LIABLE FOR ANY DIRECT, INDIRECT, INCIDENTAL, SPECIAL, * EXEMPLARY, OR CONSEQUENTIAL DAMAGES (INCLUDING, BUT NOT LIMITED TO, * PROCUREMENT OF SUBSTITUTE GOODS OR SERVICES; LOSS OF USE, DATA, OR PROFITS; * OR BUSINESS INTERRUPTION) HOWEVER CAUSED AND ON ANY THEORY OF LIABILITY, * WHETHER IN CONTRACT, STRICT LIABILITY, OR TORT (INCLUDING NEGLIGENCE * OR OTHERWISE) ARISING IN ANY WAY OUT OF THE USE OF THIS SOFTWARE, * EVEN IF ADVISED OF THE POSSIBILITY OF SUCH DAMAGE. */#ifdef HAVE_CONFIG_H# include <config.h>#endif#include "gstmsdkmpeg2enc.h"GST_DEBUG_CATEGORY_EXTERN(gst_msdkmpeg2enc_debug);#define GST_CAT_DEFAULT gst_msdkmpeg2enc_debugstaticGstStaticPadTemplatesrc_factory=GST_STATIC_PAD_TEMPLATE("src",GST_PAD_SRC,GST_PAD_ALWAYS,GST_STATIC_CAPS("video/mpeg, ""framerate = (fraction) [0/1, MAX], ""width = (int) [ 1, MAX ], height = (int) [ 1, MAX ], ""mpegversion = (int) 2 , systemstream = (bool) false, ""profile = (string) { high, main, simple }"));#define gst_msdkmpeg2enc_parent_class parent_classG_DEFINE_TYPE(GstMsdkMPEG2Enc,gst_msdkmpeg2enc,GST_TYPE_MSDKENC);staticgbooleangst_msdkmpeg2enc_set_format(GstMsdkEnc*encoder){GstMsdkMPEG2Enc*thiz=GST_MSDKMPEG2ENC(encoder);GstCaps*template_caps;GstCaps*allowed_caps=NULL;thiz->profile=0;template_caps=gst_static_pad_template_get_caps(&src_factory);allowed_caps=gst_pad_get_allowed_caps(GST_VIDEO_ENCODER_SRC_PAD(encoder));/* If downstream has ANY caps let encoder decide profile and level */if(allowed_caps==template_caps){GST_INFO_OBJECT(thiz,"downstream has ANY caps, profile/level set to auto");}elseif(allowed_caps){GstStructure*s;constgchar*profile;if(gst_caps_is_empty(allowed_caps)){gst_caps_unref(allowed_caps);gst_caps_unref(template_caps);returnFALSE;}allowed_caps=gst_caps_make_writable(allowed_caps);allowed_caps=gst_caps_fixate(allowed_caps);s=gst_caps_get_structure(allowed_caps,0);profile=gst_structure_get_string(s,"profile");if(profile){if(!strcmp(profile,"high")){thiz->profile=MFX_PROFILE_MPEG2_HIGH;}elseif(!strcmp(profile,"main")){thiz->profile=MFX_PROFILE_MPEG2_MAIN;}elseif(!strcmp(profile,"simple")){thiz->profile=MFX_PROFILE_MPEG2_SIMPLE;}else{g_assert_not_reached();}}gst_caps_unref(allowed_caps);}gst_caps_unref(template_caps);returnTRUE;}staticgbooleangst_msdkmpeg2enc_configure(GstMsdkEnc*encoder){GstMsdkMPEG2Enc*thiz=GST_MSDKMPEG2ENC(encoder);encoder->param.mfx.CodecId=MFX_CODEC_MPEG2;encoder->param.mfx.CodecProfile=thiz->profile;encoder->param.mfx.CodecLevel=0;

staticvoidgst_msdkmpeg2enc_set_property(GObject*object,guintprop_id,constGValue*value,GParamSpec*pspec){GstMsdkMPEG2Enc*thiz=GST_MSDKMPEG2ENC(object);if(!gst_msdkenc_set_common_property(object,prop_id,value,pspec))GST_WARNING_OBJECT(thiz,"Failed to set common encode property");}staticvoidgst_msdkmpeg2enc_get_property(GObject*object,guintprop_id,GValue*value,GParamSpec*pspec){GstMsdkMPEG2Enc*thiz=GST_MSDKMPEG2ENC(object);if(!gst_msdkenc_get_common_property(object,prop_id,value,pspec))GST_WARNING_OBJECT(thiz,"Failed to get common encode property");}