videoeditorengine/vedengine/inc/VedVideoClip.h
author Mikael Laine <mikael.laine@ixonos.com>
Fri, 29 Jan 2010 14:08:33 +0200
changeset 0 951a5db380a0
permissions -rw-r--r--
Committing the Video Editor package under the Eclipse Public License

/*
* Copyright (c) 2010 Ixonos Plc.
* All rights reserved.
* This component and the accompanying materials are made available
* under the terms of the "Eclipse Public License v1.0"
* which accompanies this distribution, and is available
* at the URL "http://www.eclipse.org/legal/epl-v10.html".
*
* Initial Contributors:
* Nokia Corporation - Initial contribution
*
* Contributors:
* Ixonos Plc
*
* Description:  
*
*/





#ifndef __VEDVIDEOCLIP_H__
#define __VEDVIDEOCLIP_H__


#include <e32base.h>
#include <f32file.h>

#include "VedCommon.h"
#include "VedVideoClipInfo.h"


/*
 *  Forward declarations.
 */
class CVedMovieImp;
class CAudClip;


/**
 * Individual video clip stored as a single bitstream.
 *
 * @see CVedMovie
 */
class CVedVideoClip : public CBase
{
public:

    /* Constructors. */

    static CVedVideoClip* NewL(CVedMovieImp* aMovie, const TDesC& aFileName,
							   TInt aIndex, CAudClip* aAudioClip,
							   MVedVideoClipInfoObserver& aObserver);

    static CVedVideoClip* NewL(CVedMovieImp* aMovie, 
                               CVedVideoClipGenerator& aGenerator, TInt aIndex, 
                               MVedVideoClipInfoObserver& aObserver, TBool aIsOwnedByVideoClip);
                               
    static CVedVideoClip* NewL(CVedMovieImp* aMovie, RFile* aFileHandle,
							   TInt aIndex, CAudClip* aAudioClip,
							   MVedVideoClipInfoObserver& aObserver);                               

    /* Destructor. */

    /**
     * Destroys the object and releases all resources.
     */    
    virtual ~CVedVideoClip();


    /* Property methods. */
    
    /**
     * Returns a video clip info object to get detailed information about
     * the original video clip. Note that the specified editing operations 
     * (for example, cutting or muting audio) do <em>not</em>
     * affect the values returned by the info object.
     * 
     * @return  pointer to a video clip info instance
     */
    CVedVideoClipInfo* Info();

    /**
     * Returns whether this video clip with the specified editing operations 
     * applied (for example, changing speed or muting) has an audio track or not.
     *
     * @return  <code>ETrue</code> if clip has an audio track;
     *          <code>EFalse</code> otherwise
     */
    TBool EditedHasAudio() const;


    /* Movie methods. */

    /**
     * Returns the movie that this video clip is part of.
     * 
     * @return  movie
     */
    CVedMovieImp* Movie();

    /**
     * Returns the index of this video clip in the movie.
     * 
     * @return  index of the clip
     */
     TInt Index() const;

    /**
     * Sets the index of this video clip in the movie. 
     * Panics with code <code>EVideoClipIllegalIndex</code> 
     * if the clip index is invalid.
     *
     * @param aIndex  new index of this clip
     */
    void SetIndex(TInt aIndex);


    /* Effect methods. */

    /**
     * Returns the playback speed of this video clip. Playback speed is
     * specified as parts per thousand of the normal playback speed. For example.
     * 1000 means the normal speed, 750 means 75% of the normal speed, and so on.
     *
     * @return  playback speed
     */
    TInt Speed() const;

    /**
     * Sets the playback speed of this video clip. Playback speed is
     * specified as parts per thousand of the normal playback speed. For example.
     * 1000 means the normal speed, 750 means 75% of the normal speed, and so on.
     * Panics with <code>EVideoClipIllegalSpeed</code> if playback speed is
     * illegal.
     *
     * @param aSpeed  playback speed; must be between 1 and 1000
     */
    void SetSpeed(TInt aSpeed);
    
    /**
     * Returns the color effect of this video clip.
     *
     * @return  color effect
     */
    TVedColorEffect ColorEffect() const;
    
    /**
     * Sets the color effect of this video clip.
     *
     * @param aColorEffect  color effect
     */
    void SetColorEffect(TVedColorEffect aColorEffect);


    /** 
     * Returns the color tone.
     *
     * @return color tone
     */
    TRgb ColorTone() const;
    
    /**
     * Sets the color tone.
     *
     * @param aColorTone  color tone
     */
    void SetColorTone(TRgb aColorTone);
    
    /* Audio methods. */
    
    /**
     * Returns whether this video clip can be muted or not (that is,
     * whether the mute setting has any effect). For example, if
     * this video clip has no audio track, it can never have audio
     * even if the mute setting is false.
     *
     * @return  <code>ETrue</code> if this video clip can be muted;
     *          <code>EFalse</code> otherwise
     */
    TBool IsMuteable() const;

    /**
     * Returns whether the audio track of this video clip is mute or not.
     * This covers all mute cases: user muted, automatically muted (slow motion), 
     * and missing audio track.
     *
     * @return  <code>ETrue</code> if the audio track is muted;
     *          <code>EFalse</code> otherwise
     */
    TBool Muting() const;
    
    /**
     * Returns whether the audio track of this video clip is explicitly 
     * muted by user or not. Returns ETrue also if there is no audio track at all.
     *
     * @return  <code>ETrue</code> if the audio track is muted;
     *          <code>EFalse</code> otherwise
     */
    TBool IsMuted() const;
    
    /**
     * Returns whether the audio track of this video clip is normalized or not.
     *
     * @return  <code>ETrue</code> if the audio track is normalized;
     *          <code>EFalse</code> otherwise
     */
    TBool Normalizing() const;

    
    /**
     * Sets whether the audio track of this video clip is muted or not.
     *
     * @param aVolume  <code>ETrue</code> to mute the audio track;
     *                 <code>EFalse</code> not to mute the audio track
     */
    void SetMuted(TBool aMuted);
    
    /**
     * Sets whether the audio track of this video clip is normalized or not.
     *
     * @param aNormalizing  <code>ETrue</code> to normalize the audio track,
     *                      <code>EFalse</code> not to normalize 
     */
    void SetNormalizing(TBool aNormalizing);
    
    /**
     * Inserts a dynamic level mark to a clip.
     *
     * Possible leave codes:
     *	- <code>KErrNoMemory</code> if memory allocation fails
     *
     * @param	aMark mark to be added 
     * @return  index of the mark inserted
     */
    TInt InsertDynamicLevelMarkL(const TVedDynamicLevelMark& aMark);
	
    /**
     * Removes a dynamic level mark in a clip.
     *
     * @param	aIndex index of the removed mark in this clip
     * @return  ETrue if mark was removed, EFalse otherwise
     */
    TBool RemoveDynamicLevelMark(TInt aIndex);
    
    /**
     * Returns a dynamic level mark at the specified index
     * If the index is illegal, the method panics with the code 
     * <code>EIllegalDynamicLevelMarkIndex</code> 
     *
     * @return  A dynamic level mark
     */
    TVedDynamicLevelMark DynamicLevelMark(TInt aIndex) const;
	
    /**
     * Returns the number of dynamic level marks
     * 
     * @return  The number of dynamic level mark
     */
    TInt DynamicLevelMarkCount() const;
    
    /**
    * Sets common volume gain for the clip. It is used to store
    * the gain; the actual processing will be based on dynamic level
    * marks which are set based on the gain value just before processing.
    * Since global gain setting may affect the dynamic level mark,
    * we need different variable to store the clip-specific gain also after the processing.
    * I.e. dynamic level marks do not have effect to this value.
    *
    * @param aVolumeGain
    */
    void SetVolumeGain(TInt aVolumeGain);
    
    /**
    * Gets common volume gain for the clip. 
    * Since global gain setting may affect the dynamic level mark,
    * we need different variable to store the clip-specific gain also after the processing.
    *
    * @param aVolumeGain
    */
    TInt GetVolumeGain();

    /* Timing methods. */

    /**
     * Returns the cut in time of this video clip in clip timebase.
     *
     * @return  cut in time in microseconds in clip timebase
     */
    TTimeIntervalMicroSeconds CutInTime() const;

    /**
     * Sets the cut in time of this video clip in clip timebase.
     * Panics with <code>EVideoClipIllegalCutInTime</code> if
     * cut in time is illegal.
     *
     * @param aCutInTime  cut in time in microseconds in clip timebase
     */
    void SetCutInTime(TTimeIntervalMicroSeconds aCutInTime);

    /**
     * Returns the cut out time of this video clip in clip timebase.
     *
     * @return  cut out time in microseconds in clip timebase
     */
    TTimeIntervalMicroSeconds CutOutTime() const;

    /**
     * Sets the cut out time of this video clip in clip timebase. 
     * Panics with <code>EVideoClipIllegalCutOutTime</code> if
     * cut out time is illegal.
     *
     * @param aCutOutTime  cut out time in microseconds in clip timebase
     */
    void SetCutOutTime(TTimeIntervalMicroSeconds aCutOutTime);

    /**
     * Returns the start time of this video clip in movie timebase.
     *
     * @return  start time in microseconds in movie timebase
     */
    TTimeIntervalMicroSeconds StartTime() const;

    /**
     * Returns the end time of this video clip in movie timebase.
     *
     * @return  end time in microseconds in movie timebase
     */
    TTimeIntervalMicroSeconds EndTime() const;

    /**
     * Returns the duration of this video clip with the specified
     * editing operations applied (for example, cutting 
     * and changing speed)
     * 
     * @return  duration in microseconds
     */
    TTimeIntervalMicroSeconds EditedDuration() const;

    /**
     * Update the audio clip timings.
     */
    void UpdateAudioClip();
    
protected: 


private:
    /* 
    * Default contructor 
    */
    CVedVideoClip(CVedMovieImp* aMovie, CAudClip* aAudioClip);

    /*
    * Symbian OS two phased constructor.
    */ 
    void ConstructL(const TDesC& aFileName, TInt aIndex,
                    MVedVideoClipInfoObserver& aObserver);

    void ConstructL(CVedVideoClipGenerator& aGenerator, TInt aIndex, 
                    MVedVideoClipInfoObserver& aObserver, TBool aIsOwnedByVideoClip);
                    
    void ConstructL(RFile* aFileHandle, TInt aIndex,
                    MVedVideoClipInfoObserver& aObserver);                    


private:
    // Member variables
    
    // Movie class this clip is part of.
    CVedMovieImp* iMovie;
    // Index of this clip in movie.
    TInt iIndex;
    // File of the video clip.
    RFile iLockFile;
    // Info class of this video clip.
    CVedVideoClipInfo* iInfo;

    // Speed effect of this video clip.
    TInt iSpeed;
    // Color effect of this video clip.
    TVedColorEffect iColorEffect;
    // Transition effect of this video clip.
    TVedMiddleTransitionEffect iMiddleTransitionEffect;
    
    // Cut in time of this video clip.
    TTimeIntervalMicroSeconds iCutInTime;
    // Cut out time of this video clip.
    TTimeIntervalMicroSeconds iCutOutTime;
    // Start time of this video clip.
    TTimeIntervalMicroSeconds iStartTime;

	// Audio track of this video clip
	CAudClip* iAudClip;
	// Audio track muting: slow motion mutes it automatically, but switching back to normal speed 
	// should unmute it unless user has muted it on purpose.
	TBool iUserMuted;
	// color tone
	TRgb iColorTone;
	
	TBool iLockFileOpened;
	
    friend class CVedMovieImp;
    friend class CVedMovieAddClipOperation;
};


#endif // __VEDVIDEOCLIP_H__