/* * image_handler.h - image image handler class * * Copyright (c) 2017 Intel Corporation * * Licensed under the Apache License, Version 2.0 (the "License"); * you may not use this file except in compliance with the License. * You may obtain a copy of the License at * * http://www.apache.org/licenses/LICENSE-2.0 * * Unless required by applicable law or agreed to in writing, software * distributed under the License is distributed on an "AS IS" BASIS, * WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied. * See the License for the specific language governing permissions and * limitations under the License. * * Author: Wind Yuan */ #ifndef XCAM_IMAGE_HANDLER_H #define XCAM_IMAGE_HANDLER_H #include #include #include #include #define DECLARE_HANDLER_CALLBACK(CbClass, Next, mem_func) \ class CbClass : public ::XCam::ImageHandler::Callback { \ private: ::XCam::SmartPtr _h; \ public: CbClass (const ::XCam::SmartPtr &h) { _h = h;} \ protected: void execute_status ( \ const ::XCam::SmartPtr<::XCam::ImageHandler> &handler, \ const ::XCam::SmartPtr<::XCam::ImageHandler::Parameters> ¶ms, \ const XCamReturn error) { \ _h->mem_func (handler, params, error); } \ } namespace XCam { class ImageHandler; class ImageHandler : public RefObj { public: struct Parameters { SmartPtr in_buf; SmartPtr out_buf; Parameters (const SmartPtr &in = NULL, const SmartPtr &out = NULL) : in_buf (in), out_buf (out) {} virtual ~Parameters() {} bool add_meta (const SmartPtr &meta); template SmartPtr find_meta (); private: MetaBaseList _metas; }; class Callback { public: Callback () {} virtual ~Callback () {} virtual void execute_status ( const SmartPtr &handler, const SmartPtr ¶ms, const XCamReturn error) = 0; private: XCAM_DEAD_COPY (Callback); }; public: explicit ImageHandler (const char* name); virtual ~ImageHandler (); bool set_callback (SmartPtr cb) { _callback = cb; return true; } const SmartPtr & get_callback () const { return _callback; } const char *get_name () const { return _name; } // virtual functions // execute_buffer params should NOT be const virtual XCamReturn execute_buffer (const SmartPtr ¶ms, bool sync) = 0; virtual XCamReturn finish (); virtual XCamReturn terminate (); protected: virtual void execute_status_check (const SmartPtr ¶ms, const XCamReturn error); bool set_allocator (const SmartPtr &allocator); const SmartPtr &get_allocator () const { return _allocator; } XCamReturn reserve_buffers (const VideoBufferInfo &info, uint32_t count); SmartPtr get_free_buf (); private: XCAM_DEAD_COPY (ImageHandler); private: SmartPtr _callback; SmartPtr _allocator; char *_name; }; inline bool ImageHandler::Parameters::add_meta (const SmartPtr &meta) { if (!meta.ptr ()) return false; _metas.push_back (meta); return true; } template SmartPtr ImageHandler::Parameters::find_meta () { for (MetaBaseList::iterator i = _metas.begin (); i != _metas.end (); ++i) { SmartPtr m = (*i).dynamic_cast_ptr (); if (m.ptr ()) return m; } return NULL; } }; #endif //XCAM_IMAGE_HANDLER_H