root/src/apps/mediaplayer/media_node_framework/video/VideoProducer.h
/*      Copyright (c) 1998-99, Be Incorporated, All Rights Reserved.
 *      Distributed under the terms of the Be Sample Code license.
 *
 *      Copyright (c) 2000-2008, Ingo Weinhold <ingo_weinhold@gmx.de>,
 *      Copyright (c) 2000-2008, Stephan Aßmus <superstippi@gmx.de>,
 *      All Rights Reserved. Distributed under the terms of the MIT license.
 */
#ifndef _VIDEO_PRODUCER_H
#define _VIDEO_PRODUCER_H


#include <BufferProducer.h>
#include <Controllable.h>
#include <Locker.h>
#include <MediaDefs.h>
#include <MediaEventLooper.h>
#include <MediaNode.h>
#include <OS.h>
#include <Rect.h>


class NodeManager;
class VideoSupplier;


class VideoProducer : public virtual BMediaEventLooper,
                                          public virtual BBufferProducer {
public:
                                                        VideoProducer(BMediaAddOn* addon, const char* name,
                                                                int32 internalId, NodeManager* manager,
                                                                VideoSupplier* supplier);
        virtual                                 ~VideoProducer();
        
        virtual status_t                InitCheck() const
                                                                { return fInitStatus; }
        
        // BMediaNode interface
public:
        virtual BMediaAddOn*    AddOn(int32* _internalId) const;
        virtual status_t                HandleMessage(int32 message, const void* data,
                                                                size_t size);
protected:      
        virtual void                    SetTimeSource(BTimeSource* timeSource);
        
        // BMediaEventLooper interface
protected:
        virtual void                    NodeRegistered();
        virtual void                    Start(bigtime_t performanceTime);
        virtual void                    Stop(bigtime_t performanceTime, bool immediate);
        virtual void                    Seek(bigtime_t mediaTime,
                                                                bigtime_t performanceTime);
        virtual void                    HandleEvent(const media_timed_event* event,
                                                                bigtime_t lateness,
                                                                bool realTimeEvent = false);
        virtual status_t                DeleteHook(BMediaNode* node);
        
        // BBufferProducer interface
protected:
        virtual status_t                FormatSuggestionRequested(media_type type,
                                                                int32 quality, media_format* format);
        virtual status_t                FormatProposal(const media_source &output,
                                                                media_format* format);
        virtual status_t                FormatChangeRequested(const media_source& source,
                                                                const media_destination& destination,
                                                                media_format* ioFormat, int32* _deprecated_);
        virtual status_t                GetNextOutput(int32* cookie,
                                                                media_output* outOutput);
        virtual status_t                DisposeOutputCookie(int32 cookie);
        virtual status_t                SetBufferGroup(const media_source& forSource,
                                                                BBufferGroup* group);
        virtual status_t                VideoClippingChanged(const media_source& forSource,
                                                                int16 numShorts, int16* clipData,
                                                                const media_video_display_info& display,
                                                                int32* _deprecated_);
        virtual status_t                GetLatency(bigtime_t* out_latency);
        virtual status_t                PrepareToConnect(const media_source& what,
                                                                const media_destination& where,
                                                                media_format* format, media_source* outSource,
                                                                char* out_name);
        virtual void                    Connect(status_t error, const media_source& source,
                                                                const media_destination& destination,
                                                                const media_format& format, char* ioName);
        virtual void                    Disconnect(const media_source& what,
                                                                const media_destination& where);
        virtual void                    LateNoticeReceived(const media_source& what,
                                                                bigtime_t howMuch, bigtime_t performanceTime);
        virtual void                    EnableOutput(const media_source& what, bool enabled,
                                                                int32* _deprecated_);
        virtual status_t                SetPlayRate(int32 numer, int32 denom);
        virtual void                    AdditionalBufferRequested(
                                                                const media_source& source,
                                                                media_buffer_id prevBuffer,
                                                                bigtime_t prevTime,
                                                                const media_seek_tag* prevTag);
        virtual void                    LatencyChanged(const media_source& source,
                                                                const media_destination& destination,
                                                                bigtime_t newLatency, uint32 flags);
        
 private:
                        void                    _HandleStart(bigtime_t performance_time);
                        void                    _HandleStop();
                        void                    _HandleTimeWarp(bigtime_t performance_time);
                        void                    _HandleSeek(bigtime_t performance_time);

        static  int32                   _FrameGeneratorThreadEntry(void* data);
                        int32                   _FrameGeneratorThread();

                status_t                        fInitStatus;

                int32                           fInternalID;
                BMediaAddOn*            fAddOn;

                BLocker                         fLock;
                BBufferGroup*           fBufferGroup;
                BBufferGroup*           fUsedBufferGroup;

                thread_id                       fThread;
                sem_id                          fFrameSync;

                // The remaining variables should be declared volatile, but they
                // are not here to improve the legibility of the sample code.
                int64                           fFrame;
                int64                           fFrameBase;
                bigtime_t                       fPerformanceTimeBase;
                bigtime_t                       fBufferDuration;
                bigtime_t                       fBufferLatency;
                media_output            fOutput;
                media_raw_video_format  fConnectedFormat;
                bool                            fRunning;
                bool                            fConnected;
                bool                            fEnabled;

                NodeManager*            fManager;
                VideoSupplier*          fSupplier;
};

#endif // VIDEO_PRODUCER_H