Path: blob/21.2-virgl/src/gallium/frontends/omx/tizonia/h264eprc.c
4561 views
/**************************************************************************1*2* Copyright 2013 Advanced Micro Devices, Inc.3* All Rights Reserved.4*5* Permission is hereby granted, free of charge, to any person obtaining a6* copy of this software and associated documentation files (the7* "Software"), to deal in the Software without restriction, including8* without limitation the rights to use, copy, modify, merge, publish,9* distribute, sub license, and/or sell copies of the Software, and to10* permit persons to whom the Software is furnished to do so, subject to11* the following conditions:12*13* The above copyright notice and this permission notice (including the14* next paragraph) shall be included in all copies or substantial portions15* of the Software.16*17* THE SOFTWARE IS PROVIDED "AS IS", WITHOUT WARRANTY OF ANY KIND, EXPRESS18* OR IMPLIED, INCLUDING BUT NOT LIMITED TO THE WARRANTIES OF19* MERCHANTABILITY, FITNESS FOR A PARTICULAR PURPOSE AND NON-INFRINGEMENT.20* IN NO EVENT SHALL THE COPYRIGHT HOLDER(S) OR AUTHOR(S) BE LIABLE FOR21* ANY CLAIM, DAMAGES OR OTHER LIABILITY, WHETHER IN AN ACTION OF CONTRACT,22* TORT OR OTHERWISE, ARISING FROM, OUT OF OR IN CONNECTION WITH THE23* SOFTWARE OR THE USE OR OTHER DEALINGS IN THE SOFTWARE.24*25**************************************************************************/2627#include <tizplatform.h>28#include <tizkernel.h>29#include <tizutils.h>3031#include "pipe/p_screen.h"32#include "pipe/p_video_codec.h"33#include "util/u_memory.h"3435#include "entrypoint.h"36#include "h264e.h"37#include "h264eprc.h"38#include "vid_omx_common.h"39#include "vid_enc_common.h"4041static OMX_ERRORTYPE init_port_structs(vid_enc_PrivateType * priv) {42const void * p_krn = NULL;4344assert(priv);4546/* Initialisation */47TIZ_INIT_OMX_PORT_STRUCT(priv->in_port_def_,48OMX_VID_ENC_AVC_INPUT_PORT_INDEX);49TIZ_INIT_OMX_PORT_STRUCT(priv->out_port_def_,50OMX_VID_ENC_AVC_OUTPUT_PORT_INDEX);51TIZ_INIT_OMX_PORT_STRUCT(priv->bitrate,52OMX_VID_ENC_AVC_OUTPUT_PORT_INDEX);53TIZ_INIT_OMX_PORT_STRUCT(priv->quant,54OMX_VID_ENC_AVC_OUTPUT_PORT_INDEX);55TIZ_INIT_OMX_PORT_STRUCT(priv->profile_level,56OMX_VID_ENC_AVC_OUTPUT_PORT_INDEX);5758/* Get values */59p_krn = tiz_get_krn(handleOf(priv));6061tiz_check_omx(62tiz_api_GetParameter(p_krn, handleOf(priv),63OMX_IndexParamPortDefinition, &(priv->in_port_def_)));64tiz_check_omx(65tiz_api_GetParameter(p_krn, handleOf(priv),66OMX_IndexParamPortDefinition, &(priv->out_port_def_)));67tiz_check_omx(68tiz_api_GetParameter(p_krn, handleOf(priv),69OMX_IndexParamVideoBitrate, &(priv->bitrate)));70tiz_check_omx(71tiz_api_GetParameter(p_krn, handleOf(priv),72OMX_IndexParamVideoQuantization, &(priv->quant)));73tiz_check_omx(74tiz_api_GetParameter(p_krn, handleOf(priv),75OMX_IndexParamVideoProfileLevelCurrent, &(priv->profile_level)));7677return OMX_ErrorNone;78}7980static OMX_BUFFERHEADERTYPE * get_input_buffer(vid_enc_PrivateType * priv) {81assert(priv);8283if (priv->in_port_disabled_) {84return NULL;85}8687assert(!priv->p_inhdr_); /* encode_frame expects new buffers every time */8889tiz_krn_claim_buffer(tiz_get_krn(handleOf(priv)),90OMX_VID_ENC_AVC_INPUT_PORT_INDEX, 0,91&priv->p_inhdr_);92return priv->p_inhdr_;93}9495static OMX_BUFFERHEADERTYPE * get_output_buffer(vid_enc_PrivateType * priv) {96assert(priv);9798if (priv->out_port_disabled_) {99return NULL;100}101102if (!priv->p_outhdr_) {103tiz_krn_claim_buffer(tiz_get_krn(handleOf(priv)),104OMX_VID_ENC_AVC_OUTPUT_PORT_INDEX, 0,105&priv->p_outhdr_);106}107return priv->p_outhdr_;108}109110static OMX_ERRORTYPE h264e_buffer_emptied(vid_enc_PrivateType * priv, OMX_BUFFERHEADERTYPE * p_hdr)111{112OMX_ERRORTYPE r = OMX_ErrorNone;113114assert(priv);115assert(priv->p_inhdr_ == p_hdr);116117if (!priv->out_port_disabled_) {118p_hdr->nOffset = 0;119120if ((p_hdr->nFlags & OMX_BUFFERFLAG_EOS) != 0) {121priv->eos_ = true;122}123124r = tiz_krn_release_buffer(tiz_get_krn(handleOf(priv)), 0, p_hdr);125priv->p_inhdr_ = NULL;126}127128return r;129}130131static OMX_ERRORTYPE h264e_buffer_filled(vid_enc_PrivateType * priv, OMX_BUFFERHEADERTYPE * p_hdr)132{133OMX_ERRORTYPE r = OMX_ErrorNone;134135assert(priv);136assert(priv->p_outhdr_ == p_hdr);137assert(p_hdr);138139if (!priv->in_port_disabled_) {140p_hdr->nOffset = 0;141142if (priv->eos_) {143/* EOS has been received and all the input data has been consumed144* already, so its time to propagate the EOS flag */145priv->p_outhdr_->nFlags |= OMX_BUFFERFLAG_EOS;146}147148r = tiz_krn_release_buffer(tiz_get_krn(handleOf(priv)),149OMX_VID_ENC_AVC_OUTPUT_PORT_INDEX,150p_hdr);151priv->p_outhdr_ = NULL;152}153154return r;155}156157158static void release_input_header(vid_enc_PrivateType * priv) {159assert(!priv->in_port_disabled_);160if (priv->p_inhdr_) {161(void) tiz_krn_release_buffer(tiz_get_krn(handleOf(priv)),162OMX_VID_ENC_AVC_INPUT_PORT_INDEX,163priv->p_inhdr_);164}165priv->p_inhdr_ = NULL;166}167168static void release_output_header(vid_enc_PrivateType * priv) {169if (priv->p_outhdr_) {170assert(!priv->out_port_disabled_);171(void) tiz_krn_release_buffer(tiz_get_krn(handleOf(priv)),172OMX_VID_ENC_AVC_OUTPUT_PORT_INDEX,173priv->p_outhdr_);174priv->p_outhdr_ = NULL;175}176}177178static OMX_ERRORTYPE h264e_release_all_headers(vid_enc_PrivateType * priv)179{180assert(priv);181182release_input_header(priv);183release_output_header(priv);184185return OMX_ErrorNone;186}187188static void reset_stream_parameters(vid_enc_PrivateType * priv)189{190assert(priv);191init_port_structs(priv);192priv->p_inhdr_ = 0;193priv->p_outhdr_ = 0;194priv->eos_ = false;195}196197/* Replacement for bellagio's omx_base_filter_BufferMgmtFunction */198static OMX_ERRORTYPE h264e_manage_buffers(vid_enc_PrivateType* priv) {199OMX_BUFFERHEADERTYPE * in_buf = priv->p_inhdr_;200OMX_BUFFERHEADERTYPE * out_buf = priv->p_outhdr_;201OMX_ERRORTYPE r = OMX_ErrorNone;202203if (in_buf->nFilledLen > 0) {204vid_enc_BufferEncoded_common(priv, in_buf, out_buf);205} else {206in_buf->nFilledLen = 0;207}208209out_buf->nTimeStamp = in_buf->nTimeStamp;210211/* Release input buffer if possible */212if (in_buf->nFilledLen == 0) {213r = h264e_buffer_emptied(priv, in_buf);214}215216/* Realase output buffer if filled or eos */217if ((out_buf->nFilledLen != 0) || priv->eos_) {218r = h264e_buffer_filled(priv, out_buf);219}220221return r;222}223224static struct encode_task *enc_NeedTask(vid_enc_PrivateType * priv)225{226OMX_VIDEO_PORTDEFINITIONTYPE *def = &priv->in_port_def_.format.video;227228return enc_NeedTask_common(priv, def);229}230231static void enc_ScaleInput(vid_enc_PrivateType * priv, struct pipe_video_buffer **vbuf, unsigned *size)232{233OMX_VIDEO_PORTDEFINITIONTYPE *def = &priv->in_port_def_.format.video;234enc_ScaleInput_common(priv, def, vbuf, size);235}236237static void enc_HandleTask(vid_enc_PrivateType * priv, struct encode_task *task,238enum pipe_h2645_enc_picture_type picture_type)239{240unsigned size = priv->out_port_def_.nBufferSize;241struct pipe_video_buffer *vbuf = task->buf;242struct pipe_h264_enc_picture_desc picture = {};243244/* -------------- scale input image --------- */245enc_ScaleInput(priv, &vbuf, &size);246priv->s_pipe->flush(priv->s_pipe, NULL, 0);247248/* -------------- allocate output buffer --------- */249task->bitstream = pipe_buffer_create(priv->s_pipe->screen,250PIPE_BIND_VERTEX_BUFFER,251PIPE_USAGE_STAGING, /* map for read */252size);253254picture.picture_type = picture_type;255picture.pic_order_cnt = task->pic_order_cnt;256if (priv->restricted_b_frames && picture_type == PIPE_H2645_ENC_PICTURE_TYPE_B)257picture.not_referenced = true;258enc_ControlPicture_common(priv, &picture);259260/* -------------- encode frame --------- */261priv->codec->begin_frame(priv->codec, vbuf, &picture.base);262priv->codec->encode_bitstream(priv->codec, vbuf, task->bitstream, &task->feedback);263priv->codec->end_frame(priv->codec, vbuf, &picture.base);264}265266static void enc_ClearBframes(vid_enc_PrivateType * priv, struct input_buf_private *inp)267{268struct encode_task *task;269270if (list_is_empty(&priv->b_frames))271return;272273task = LIST_ENTRY(struct encode_task, priv->b_frames.prev, list);274list_del(&task->list);275276/* promote last from to P frame */277priv->ref_idx_l0 = priv->ref_idx_l1;278enc_HandleTask(priv, task, PIPE_H2645_ENC_PICTURE_TYPE_P);279list_addtail(&task->list, &inp->tasks);280priv->ref_idx_l1 = priv->frame_num++;281282/* handle B frames */283LIST_FOR_EACH_ENTRY(task, &priv->b_frames, list) {284enc_HandleTask(priv, task, PIPE_H2645_ENC_PICTURE_TYPE_B);285if (!priv->restricted_b_frames)286priv->ref_idx_l0 = priv->frame_num;287priv->frame_num++;288}289290enc_MoveTasks(&priv->b_frames, &inp->tasks);291}292293static OMX_ERRORTYPE enc_LoadImage(vid_enc_PrivateType * priv, OMX_BUFFERHEADERTYPE *buf,294struct pipe_video_buffer *vbuf)295{296OMX_VIDEO_PORTDEFINITIONTYPE *def = &priv->in_port_def_.format.video;297return enc_LoadImage_common(priv, def, buf, vbuf);298}299300static OMX_ERRORTYPE encode_frame(vid_enc_PrivateType * priv, OMX_BUFFERHEADERTYPE * in_buf)301{302struct input_buf_private *inp = in_buf->pInputPortPrivate;303enum pipe_h2645_enc_picture_type picture_type;304struct encode_task *task;305unsigned stacked_num = 0;306OMX_ERRORTYPE err;307308enc_MoveTasks(&inp->tasks, &priv->free_tasks);309task = enc_NeedTask(priv);310if (!task)311return OMX_ErrorInsufficientResources;312313/* EOS */314if (in_buf->nFilledLen == 0) {315if (in_buf->nFlags & OMX_BUFFERFLAG_EOS) {316in_buf->nFilledLen = in_buf->nAllocLen;317enc_ClearBframes(priv, inp);318enc_MoveTasks(&priv->stacked_tasks, &inp->tasks);319priv->codec->flush(priv->codec);320}321return h264e_manage_buffers(priv);322}323324if (in_buf->pOutputPortPrivate) {325struct pipe_video_buffer *vbuf = in_buf->pOutputPortPrivate;326in_buf->pOutputPortPrivate = task->buf;327task->buf = vbuf;328} else {329/* ------- load input image into video buffer ---- */330err = enc_LoadImage(priv, in_buf, task->buf);331if (err != OMX_ErrorNone) {332FREE(task);333return err;334}335}336337/* -------------- determine picture type --------- */338if (!(priv->pic_order_cnt % OMX_VID_ENC_IDR_PERIOD_DEFAULT) ||339priv->force_pic_type.IntraRefreshVOP) {340enc_ClearBframes(priv, inp);341picture_type = PIPE_H2645_ENC_PICTURE_TYPE_IDR;342priv->force_pic_type.IntraRefreshVOP = OMX_FALSE;343priv->frame_num = 0;344} else if (priv->codec->profile == PIPE_VIDEO_PROFILE_MPEG4_AVC_BASELINE ||345!(priv->pic_order_cnt % OMX_VID_ENC_P_PERIOD_DEFAULT) ||346(in_buf->nFlags & OMX_BUFFERFLAG_EOS)) {347picture_type = PIPE_H2645_ENC_PICTURE_TYPE_P;348} else {349picture_type = PIPE_H2645_ENC_PICTURE_TYPE_B;350}351352task->pic_order_cnt = priv->pic_order_cnt++;353354if (picture_type == PIPE_H2645_ENC_PICTURE_TYPE_B) {355/* put frame at the tail of the queue */356list_addtail(&task->list, &priv->b_frames);357} else {358/* handle I or P frame */359priv->ref_idx_l0 = priv->ref_idx_l1;360enc_HandleTask(priv, task, picture_type);361list_addtail(&task->list, &priv->stacked_tasks);362LIST_FOR_EACH_ENTRY(task, &priv->stacked_tasks, list) {363++stacked_num;364}365if (stacked_num == priv->stacked_frames_num) {366struct encode_task *t;367t = LIST_ENTRY(struct encode_task, priv->stacked_tasks.next, list);368list_del(&t->list);369list_addtail(&t->list, &inp->tasks);370}371priv->ref_idx_l1 = priv->frame_num++;372373/* handle B frames */374LIST_FOR_EACH_ENTRY(task, &priv->b_frames, list) {375enc_HandleTask(priv, task, PIPE_H2645_ENC_PICTURE_TYPE_B);376if (!priv->restricted_b_frames)377priv->ref_idx_l0 = priv->frame_num;378priv->frame_num++;379}380381enc_MoveTasks(&priv->b_frames, &inp->tasks);382}383384if (list_is_empty(&inp->tasks)) {385return h264e_buffer_emptied(priv, in_buf);386} else {387return h264e_manage_buffers(priv);388}389}390391static OMX_ERRORTYPE h264e_prc_create_encoder(void *ap_obj)392{393vid_enc_PrivateType *priv = ap_obj;394struct pipe_screen *screen;395396priv->screen = omx_get_screen();397if (!priv->screen)398return OMX_ErrorInsufficientResources;399400screen = priv->screen->pscreen;401if (!screen->get_video_param(screen, PIPE_VIDEO_PROFILE_MPEG4_AVC_HIGH,402PIPE_VIDEO_ENTRYPOINT_ENCODE, PIPE_VIDEO_CAP_SUPPORTED))403return OMX_ErrorBadParameter;404405priv->s_pipe = pipe_create_multimedia_context(screen);406if (!priv->s_pipe)407return OMX_ErrorInsufficientResources;408409enc_InitCompute_common(priv);410411if (!vl_compositor_init(&priv->compositor, priv->s_pipe)) {412priv->s_pipe->destroy(priv->s_pipe);413priv->s_pipe = NULL;414return OMX_ErrorInsufficientResources;415}416417if (!vl_compositor_init_state(&priv->cstate, priv->s_pipe)) {418vl_compositor_cleanup(&priv->compositor);419priv->s_pipe->destroy(priv->s_pipe);420priv->s_pipe = NULL;421return OMX_ErrorInsufficientResources;422}423424priv->t_pipe = pipe_create_multimedia_context(screen);425if (!priv->t_pipe)426return OMX_ErrorInsufficientResources;427428list_inithead(&priv->free_tasks);429list_inithead(&priv->used_tasks);430list_inithead(&priv->b_frames);431list_inithead(&priv->stacked_tasks);432433return OMX_ErrorNone;434}435436static void h264e_prc_destroy_encoder(void *ap_obj)437{438vid_enc_PrivateType *priv = ap_obj;439int i;440441assert (priv);442443enc_ReleaseTasks(&priv->free_tasks);444enc_ReleaseTasks(&priv->used_tasks);445enc_ReleaseTasks(&priv->b_frames);446enc_ReleaseTasks(&priv->stacked_tasks);447448for (i = 0; i < OMX_VID_ENC_NUM_SCALING_BUFFERS; ++i)449if (priv->scale_buffer[i])450priv->scale_buffer[i]->destroy(priv->scale_buffer[i]);451452if (priv->s_pipe) {453vl_compositor_cleanup_state(&priv->cstate);454vl_compositor_cleanup(&priv->compositor);455enc_ReleaseCompute_common(priv);456priv->s_pipe->destroy(priv->s_pipe);457}458459if (priv->t_pipe)460priv->t_pipe->destroy(priv->t_pipe);461462if (priv->screen)463omx_put_screen();464}465466/*467* h264eprc468*/469470static void * h264e_prc_ctor(void *ap_obj, va_list * app)471{472vid_enc_PrivateType *priv = super_ctor(typeOf(ap_obj, "h264eprc"), ap_obj, app);473assert (priv);474475if (h264e_prc_create_encoder(ap_obj) != OMX_ErrorNone)476return priv;477478priv->p_inhdr_ = 0;479priv->p_outhdr_ = 0;480priv->profile_level.eProfile = OMX_VIDEO_AVCProfileBaseline;481priv->profile_level.eLevel = OMX_VIDEO_AVCLevel51;482priv->force_pic_type.IntraRefreshVOP = OMX_FALSE;483priv->frame_num = 0;484priv->pic_order_cnt = 0;485priv->restricted_b_frames = debug_get_bool_option("OMX_USE_RESTRICTED_B_FRAMES", FALSE);486priv->scale.xWidth = OMX_VID_ENC_SCALING_WIDTH_DEFAULT;487priv->scale.xHeight = OMX_VID_ENC_SCALING_WIDTH_DEFAULT;488priv->in_port_disabled_ = false;489priv->out_port_disabled_ = false;490reset_stream_parameters(priv);491492return priv;493}494495static void * h264e_prc_dtor(void *ap_obj)496{497h264e_prc_destroy_encoder(ap_obj);498return super_dtor(typeOf(ap_obj, "h264eprc"), ap_obj);499}500501static OMX_ERRORTYPE h264e_prc_allocate_resources(void *ap_obj, OMX_U32 a_pid)502{503vid_enc_PrivateType *priv = ap_obj;504505assert(priv);506if (!priv->screen)507return OMX_ErrorInsufficientResources;508509return OMX_ErrorNone;510}511512static OMX_ERRORTYPE h264e_prc_deallocate_resources(void *ap_obj)513{514return OMX_ErrorNone;515}516517static OMX_ERRORTYPE h264e_prc_prepare_to_transfer(void *ap_obj, OMX_U32 a_pid)518{519vid_enc_PrivateType *priv = ap_obj;520521assert(priv);522523init_port_structs(priv);524525priv->eos_ = false;526527struct pipe_video_codec templat = {};528529templat.profile = enc_TranslateOMXProfileToPipe(priv->profile_level.eProfile);530templat.level = enc_TranslateOMXLevelToPipe(priv->profile_level.eLevel);531templat.entrypoint = PIPE_VIDEO_ENTRYPOINT_ENCODE;532templat.chroma_format = PIPE_VIDEO_CHROMA_FORMAT_420;533templat.width = priv->scale_buffer[priv->current_scale_buffer] ?534priv->scale.xWidth : priv->in_port_def_.format.video.nFrameWidth;535templat.height = priv->scale_buffer[priv->current_scale_buffer] ?536priv->scale.xHeight : priv->in_port_def_.format.video.nFrameHeight;537538if (templat.profile == PIPE_VIDEO_PROFILE_MPEG4_AVC_BASELINE) {539struct pipe_screen *screen = priv->screen->pscreen;540templat.max_references = 1;541priv->stacked_frames_num =542screen->get_video_param(screen,543PIPE_VIDEO_PROFILE_MPEG4_AVC_HIGH,544PIPE_VIDEO_ENTRYPOINT_ENCODE,545PIPE_VIDEO_CAP_STACKED_FRAMES);546} else {547templat.max_references = OMX_VID_ENC_P_PERIOD_DEFAULT;548priv->stacked_frames_num = 1;549}550priv->codec = priv->s_pipe->create_video_codec(priv->s_pipe, &templat);551552return OMX_ErrorNone;553}554555static OMX_ERRORTYPE h264e_prc_transfer_and_process(void *ap_obj, OMX_U32 a_pid)556{557return OMX_ErrorNone;558}559560static OMX_ERRORTYPE h264e_prc_stop_and_return(void *ap_obj)561{562vid_enc_PrivateType *priv = (vid_enc_PrivateType *) ap_obj;563return h264e_release_all_headers(priv);564}565566static OMX_ERRORTYPE h264e_prc_buffers_ready(const void *ap_obj)567{568vid_enc_PrivateType *priv = (vid_enc_PrivateType *) ap_obj;569OMX_BUFFERHEADERTYPE *in_buf = NULL;570OMX_BUFFERHEADERTYPE *out_buf = NULL;571OMX_ERRORTYPE r = OMX_ErrorNone;572573assert(priv);574575/* Don't get input buffer if output buffer not found */576while (!priv->eos_ && (out_buf = get_output_buffer(priv)) && (in_buf = get_input_buffer(priv))) {577if (!priv->out_port_disabled_) {578r = encode_frame(priv, in_buf);579}580}581582return r;583}584585static OMX_ERRORTYPE h264e_prc_port_flush(const void *ap_obj, OMX_U32 a_pid)586{587vid_enc_PrivateType *priv = (vid_enc_PrivateType *) ap_obj;588if (OMX_ALL == a_pid || OMX_VID_ENC_AVC_INPUT_PORT_INDEX == a_pid) {589release_input_header(priv);590reset_stream_parameters(priv);591}592if (OMX_ALL == a_pid || OMX_VID_ENC_AVC_OUTPUT_PORT_INDEX == a_pid) {593release_output_header(priv);594}595return OMX_ErrorNone;596}597598static OMX_ERRORTYPE h264e_prc_port_disable(const void *ap_obj, OMX_U32 a_pid)599{600vid_enc_PrivateType *priv = (vid_enc_PrivateType *) ap_obj;601assert(priv);602if (OMX_ALL == a_pid || OMX_VID_ENC_AVC_INPUT_PORT_INDEX == a_pid) {603/* Release all buffers */604h264e_release_all_headers(priv);605reset_stream_parameters(priv);606priv->in_port_disabled_ = true;607}608if (OMX_ALL == a_pid || OMX_VID_ENC_AVC_OUTPUT_PORT_INDEX == a_pid) {609release_output_header(priv);610priv->out_port_disabled_ = true;611}612return OMX_ErrorNone;613}614615static OMX_ERRORTYPE h264e_prc_port_enable(const void *ap_obj, OMX_U32 a_pid)616{617vid_enc_PrivateType * priv = (vid_enc_PrivateType *) ap_obj;618assert(priv);619if (OMX_ALL == a_pid || OMX_VID_ENC_AVC_INPUT_PORT_INDEX == a_pid) {620if (priv->in_port_disabled_) {621reset_stream_parameters(priv);622priv->in_port_disabled_ = false;623}624}625if (OMX_ALL == a_pid || OMX_VID_ENC_AVC_OUTPUT_PORT_INDEX == a_pid) {626priv->out_port_disabled_ = false;627}628return OMX_ErrorNone;629}630631/*632* h264e_prc_class633*/634635static void * h264e_prc_class_ctor(void *ap_obj, va_list * app)636{637/* NOTE: Class methods might be added in the future. None for now. */638return super_ctor(typeOf(ap_obj, "h264eprc_class"), ap_obj, app);639}640641/*642* initialization643*/644645void * h264e_prc_class_init(void * ap_tos, void * ap_hdl)646{647void * tizprc = tiz_get_type(ap_hdl, "tizprc");648void * h264eprc_class = factory_new649/* TIZ_CLASS_COMMENT: class type, class name, parent, size */650(classOf(tizprc), "h264eprc_class", classOf(tizprc),651sizeof(h264e_prc_class_t),652/* TIZ_CLASS_COMMENT: */653ap_tos, ap_hdl,654/* TIZ_CLASS_COMMENT: class constructor */655ctor, h264e_prc_class_ctor,656/* TIZ_CLASS_COMMENT: stop value*/6570);658return h264eprc_class;659}660661void * h264e_prc_init(void * ap_tos, void * ap_hdl)662{663void * tizprc = tiz_get_type(ap_hdl, "tizprc");664void * h264eprc_class = tiz_get_type(ap_hdl, "h264eprc_class");665TIZ_LOG_CLASS (h264eprc_class);666void * h264eprc = factory_new667/* TIZ_CLASS_COMMENT: class type, class name, parent, size */668(h264eprc_class, "h264eprc", tizprc, sizeof(vid_enc_PrivateType),669/* TIZ_CLASS_COMMENT: */670ap_tos, ap_hdl,671/* TIZ_CLASS_COMMENT: class constructor */672ctor, h264e_prc_ctor,673/* TIZ_CLASS_COMMENT: class destructor */674dtor, h264e_prc_dtor,675/* TIZ_CLASS_COMMENT: */676tiz_srv_allocate_resources, h264e_prc_allocate_resources,677/* TIZ_CLASS_COMMENT: */678tiz_srv_deallocate_resources, h264e_prc_deallocate_resources,679/* TIZ_CLASS_COMMENT: */680tiz_srv_prepare_to_transfer, h264e_prc_prepare_to_transfer,681/* TIZ_CLASS_COMMENT: */682tiz_srv_transfer_and_process, h264e_prc_transfer_and_process,683/* TIZ_CLASS_COMMENT: */684tiz_srv_stop_and_return, h264e_prc_stop_and_return,685/* TIZ_CLASS_COMMENT: */686tiz_prc_buffers_ready, h264e_prc_buffers_ready,687/* TIZ_CLASS_COMMENT: */688tiz_prc_port_flush, h264e_prc_port_flush,689/* TIZ_CLASS_COMMENT: */690tiz_prc_port_disable, h264e_prc_port_disable,691/* TIZ_CLASS_COMMENT: */692tiz_prc_port_enable, h264e_prc_port_enable,693/* TIZ_CLASS_COMMENT: stop value*/6940);695696return h264eprc;697}698699700