/*
-------------------------------------------------------------------
    AM_MEDIA_TYPE service functions declarations
-------------------------------------------------------------------
*/

#ifndef MPLAYER_MEDIATYPE_H
#define MPLAYER_MEDIATYPE_H

#include "guids.h"

typedef struct __attribute__((__packed__)) MediaType
{
    GUID	majortype;		//0x0
    GUID	subtype;		//0x10
    int		bFixedSizeSamples;	//0x20
    int		bTemporalCompression;	//0x24
    unsigned long lSampleSize;		//0x28
    GUID	formattype;		//0x2c
    IUnknown*	pUnk;			//0x3c
    unsigned long cbFormat;		//0x40
    char*	pbFormat;		//0x44
} AM_MEDIA_TYPE;

/**
 * \brief print info from AM_MEDIA_TYPE structure
 * =param[in] label short lable for media type
 * \param[in] pmt pointer to AM_MEDIA_TYPE
 *
 * routine used for debug purposes
 *
 */
void DisplayMediaType(const char * label,const AM_MEDIA_TYPE* pmt);
/**
 * \brief frees memory, pointed by pbFormat and pUnk members of AM_MEDIA_TYPE structure
 *
 * \param[in] pmt pointer to structure
 *
 * \note
 * routine does not frees memory allocated for AM_MEDIA_TYPE, so given pointer will be
 * valid after this routine call.
 *
 */
void FreeMediaType(AM_MEDIA_TYPE* pmt);
/**
 * \brief frees memory allocated for AM_MEDIA_TYPE structure, including pbFormat and pUnk
 *        members
 *
 * \param[in] pmt pointer to structure
 *
 * \note
 * after call to this routine, pointer to AM_MEDIA_TYPE will not be valid anymore
 *
 */
void DeleteMediaType(AM_MEDIA_TYPE* pmt);
/**
 * \brief copyies info from source to destination AM_MEDIA_TYPE structures
 *
 * \param[in] pSrc pointer to AM_MEDIA_TYPE structure to copy data from
 * \param[out] pDst pointer to AM_MEDIA_TYPE structure to copy data to
 *
 * \return S_OK - success
 * \return E_POINTER - pSrc or pDst is NULL or (pSrc->cbFormat && !pSrc->pbFormat)
 * \return E_INVALIDARG - (pSrc == pDst)
 * \return E_OUTOFMEMORY - Insufficient memory
 *
 * \note
 * - pDst must point to existing AM_MEDIA_TYPE structure (all data will be overwritten)
 * - if pDst->pbFormat!=NULL this will cause memory leak (as described in Directshow SDK)!
 *
 */
HRESULT CopyMediaType(AM_MEDIA_TYPE* pDst,const AM_MEDIA_TYPE* pSrc);
/**
 * \brief allocates new AM_MEDIA_TYPE structure and fills it with info from given one
 *
 * \param[in] pSrc pointer to AM_MEDIA_TYPE structure to copy data from
 *
 * \return result code, returned from CopyMediaType
 *
 */
AM_MEDIA_TYPE* CreateMediaType(const AM_MEDIA_TYPE* pSrc);

/**
 * \brief compares two AM_MEDIA_TYPE structures for compatibility
 *
 * \param[in] pmt1 first  AM_MEDIA_TYPE structure for compare
 * \param[in] pmt2 second AM_MEDIA_TYPE structure for compare
 * \param[in] bWildcards 1 means that GUID_NULL of one structure will be compatible with any value of another structure
 *
 * \return 1 if structures are compatible
 * \return 0 if structures are not compatible
 *
 */
int CompareMediaTypes(const AM_MEDIA_TYPE * pmt1, const AM_MEDIA_TYPE * pmt2, int bWildcards);

#endif /* MPLAYER_MEDIA_TYPE_H */
