//
// Copyright (c) Microsoft Corporation.  All rights reserved.
//
// Module Name:
//
//      DvbSiParser.idl
//
// Abstract:
//
//      Interface definitions for the DVB/ISDB SI parsing functionality
//
// Notes:
//
//      This IDL file is not meant to be built independently, but to be
//        included in a master IDL file with a unique coclass defined for
//        IDvbSiParser. No coclasses need to be defined for the other
//        interfaces. See DTVParse.idl for an example.
//
/////////////////////////////////////////////////////////////////////////////

#ifndef AM_LOCAL
#define AM_LOCAL local,
#define AM_ANNOTATION(_x_) ,annotation(_x_)
#endif

import "oaidl.idl";
import "ocidl.idl";
import "wtypes.idl";
import "mpeg2structs.idl";
import "mpeg2data.idl";
import "mpeg2psiparser.idl";


    // String conversion mode parameter
typedef enum
{
    STRCONV_MODE_DVB = 0,
    STRCONV_MODE_DVB_EMPHASIS,
    STRCONV_MODE_DVB_WITHOUT_EMPHASIS,
    STRCONV_MODE_ISDB,
} DVB_STRCONV_MODE;


    // Forward interface declarations
interface IPAT;
interface ICAT;
interface IPMT;
interface ITSDT;
interface IDVB_NIT;
interface IDVB_SDT;
interface IISDB_SDT;
interface IDVB_EIT;
interface IDVB_EIT2;
interface IDVB_BAT;
interface IDVB_RST;
interface IDVB_ST;
interface IDVB_TDT;
interface IDVB_TOT;
interface IDVB_DIT;
interface IDVB_SIT;
interface IISDB_BIT;
interface IISDB_NBIT;
interface IISDB_LDT;
interface IISDB_SDTT;
interface IISDB_CDT;
interface IISDB_EMM;


    ////////////////////////////////////
    //
    // IDvbSiParser Interface
    //
    ////////////////////////////////////

    [
        AM_LOCAL
        object,
        uuid(B758A7BD-14DC-449d-B828-35909ACB3B1E),
        pointer_default(unique)
    ]
    interface IDvbSiParser : IUnknown
    {
        HRESULT Initialize([in] IUnknown * punkMpeg2Data);
        
        HRESULT GetPAT([out] IPAT ** ppPAT);

        HRESULT GetCAT([in]  DWORD   dwTimeout,
                       [out] ICAT ** ppCAT);

        HRESULT GetPMT([in] PID pid,
                       [in AM_ANNOTATION("__in_opt")] WORD * pwProgramNumber,
                       [out] IPMT ** ppPMT);

        HRESULT GetTSDT([out] ITSDT ** ppTSDT);

        HRESULT GetNIT([in] TID tableId,
                       [in AM_ANNOTATION("__in_opt")] WORD * pwNetworkId,
                       [out] IDVB_NIT ** ppNIT);

        HRESULT GetSDT([in] TID tableId,
                       [in AM_ANNOTATION("__in_opt")] WORD * pwTransportStreamId,
                       [out] IDVB_SDT ** ppSDT);

        HRESULT GetEIT([in] TID tableId,
                       [in AM_ANNOTATION("__in_opt")] WORD * pwServiceId,
                       [out] IDVB_EIT ** ppEIT);

        HRESULT GetBAT([in AM_ANNOTATION("__in_opt")] WORD * pwBouquetId,
                       [out] IDVB_BAT ** ppBAT);

        HRESULT GetRST([in] DWORD        dwTimeout,
                       [out] IDVB_RST ** ppRST);

        HRESULT GetST([in]  PID        pid,
                      [in]  DWORD      dwTimeout,
                      [out] IDVB_ST ** ppST);

        HRESULT GetTDT([out] IDVB_TDT ** ppTDT);

        HRESULT GetTOT([out] IDVB_TOT ** ppTOT);

        HRESULT GetDIT([in] DWORD        dwTimeout,
                       [out] IDVB_DIT ** ppDIT);

        HRESULT GetSIT([in] DWORD        dwTimeout,
                       [out] IDVB_SIT ** ppSIT);

    };



    ////////////////////////////////////
    //
    // IDvbSiParser2 Interface
    // 
    // Note: 
    // When this interface is updated,
    // update also the corresponding
    // inherited IIsdbSiParserX.
    //
    ////////////////////////////////////

    [
        AM_LOCAL
        object,
        uuid(0AC5525F-F816-42F4-93BA-4C0F32F46E54),
        pointer_default(unique)
    ]
    interface IDvbSiParser2 : IDvbSiParser
    {        
        HRESULT GetEIT2([in] TID tableId,
                        [in AM_ANNOTATION("__in_opt")] WORD * pwServiceId,
                        [in AM_ANNOTATION("__in_opt")] BYTE * pbSegment,
                        [out] IDVB_EIT2 ** ppEIT);
    };



    ////////////////////////////////////
    //
    // IIsdbSiParser2 Interface
    //
    ////////////////////////////////////
    [
        AM_LOCAL
        object,
        uuid(900E4BB7-18CD-453F-98BE-3BE6AA211772),
        pointer_default(unique)
    ]
    interface IIsdbSiParser2 : IDvbSiParser2
    {
        HRESULT GetSDT([in] TID tableId,
                       [in AM_ANNOTATION("__in_opt")] WORD * pwTransportStreamId,
                       [out] IISDB_SDT ** ppSDT);

        HRESULT GetBIT([in] TID tableId,
                       [in AM_ANNOTATION("__in_opt")] WORD * pwOriginalNetworkId,
                       [out] IISDB_BIT ** ppBIT);

        HRESULT GetNBIT([in] TID tableId,
                        [in AM_ANNOTATION("__in_opt")] WORD * pwOriginalNetworkId,
                        [out] IISDB_NBIT ** ppNBIT);

        HRESULT GetLDT([in] TID tableId,
                       [in AM_ANNOTATION("__in_opt")] WORD * pwOriginalServiceId,
                       [out] IISDB_LDT ** ppLDT);

        HRESULT GetSDTT([in] TID tableId,
                        [in AM_ANNOTATION("__in_opt")] WORD * pwTableIdExt,
                        [out] IISDB_SDTT ** ppSDTT);

        HRESULT GetCDT([in] TID tableId,
                       [in] BYTE bSectionNumber,
                       [in AM_ANNOTATION("__in_opt")] WORD * pwDownloadDataId,
                       [out] IISDB_CDT ** ppCDT);

        HRESULT GetEMM([in] PID pid,
                       [in] WORD wTableIdExt,
                       [out] IISDB_EMM ** ppEMM);
    };



    ////////////////////////////////////
    //
    // IDVB_NIT Interface
    //
    ////////////////////////////////////

    [
        AM_LOCAL
        object,
        uuid(C64935F4-29E4-4e22-911A-63F7F55CB097),
        pointer_default(unique)
    ]
    interface IDVB_NIT : IUnknown
    {
        HRESULT Initialize([in] ISectionList * pSectionList,
                           [in] IMpeg2Data *   pMPEGData);

        HRESULT GetVersionNumber([out] BYTE * pbVal);

        HRESULT GetNetworkId([out] WORD * pwVal);

        HRESULT GetCountOfTableDescriptors([out] DWORD * pdwVal);

        HRESULT GetTableDescriptorByIndex([in]  DWORD                 dwIndex,
                                          [out] IGenericDescriptor ** ppDescriptor);

        HRESULT GetTableDescriptorByTag([in]  BYTE                  bTag,
                                        [in, out, AM_ANNOTATION("__inout_opt")]  DWORD * pdwCookie,
                                        [out] IGenericDescriptor ** ppDescriptor);

        HRESULT GetCountOfRecords([out] DWORD * pdwVal);

        HRESULT GetRecordTransportStreamId([in]  DWORD  dwRecordIndex,
                                           [out] WORD * pwVal);

        HRESULT GetRecordOriginalNetworkId([in]  DWORD  dwRecordIndex,
                                           [out] WORD * pwVal);

        HRESULT GetRecordCountOfDescriptors([in]  DWORD   dwRecordIndex,
                                            [out] DWORD * pdwVal);

        HRESULT GetRecordDescriptorByIndex([in]  DWORD                 dwRecordIndex,
                                           [in]  DWORD                 dwIndex,
                                           [out] IGenericDescriptor ** ppDescriptor);

        HRESULT GetRecordDescriptorByTag([in]  DWORD                 dwRecordIndex,
                                         [in]  BYTE                  bTag,
                                         [in, out, AM_ANNOTATION("__inout_opt")]  DWORD * pdwCookie,
                                         [out] IGenericDescriptor ** ppDescriptor);

        HRESULT RegisterForNextTable([in] HANDLE hNextTableAvailable);

        HRESULT GetNextTable([out] IDVB_NIT ** ppNIT);

        HRESULT RegisterForWhenCurrent([in] HANDLE hNextTableIsCurrent);

        HRESULT ConvertNextToCurrent(void);

        HRESULT GetVersionHash([out] DWORD * pdwVersionHash);
    };



    ////////////////////////////////////
    //
    // IDVB_SDT Interface
    //
    ////////////////////////////////////

    [
        AM_LOCAL
        object,
        uuid(02CAD8D3-FE43-48e2-90BD-450ED9A8A5FD),
        pointer_default(unique)
    ]
    interface IDVB_SDT : IUnknown
    {
        HRESULT Initialize([in] ISectionList * pSectionList,
                           [in] IMpeg2Data *   pMPEGData);

        HRESULT GetVersionNumber([out] BYTE * pbVal);

        HRESULT GetTransportStreamId([out] WORD * pwVal);

        HRESULT GetOriginalNetworkId([out] WORD * pwVal);

        HRESULT GetCountOfRecords([out] DWORD * pdwVal);

        HRESULT GetRecordServiceId([in]  DWORD  dwRecordIndex,
                                   [out] WORD * pwVal);

        HRESULT GetRecordEITScheduleFlag([in]  DWORD  dwRecordIndex,
                                         [out] BOOL * pfVal);

        HRESULT GetRecordEITPresentFollowingFlag([in]  DWORD  dwRecordIndex,
                                                 [out] BOOL * pfVal);

        HRESULT GetRecordRunningStatus([in]  DWORD  dwRecordIndex,
                                       [out] BYTE * pbVal);

        HRESULT GetRecordFreeCAMode([in]  DWORD  dwRecordIndex,
                                    [out] BOOL * pfVal);

        HRESULT GetRecordCountOfDescriptors([in]  DWORD   dwRecordIndex,
                                            [out] DWORD * pdwVal);

        HRESULT GetRecordDescriptorByIndex([in]  DWORD                 dwRecordIndex,
                                           [in]  DWORD                 dwIndex,
                                           [out] IGenericDescriptor ** ppDescriptor);

        HRESULT GetRecordDescriptorByTag([in]  DWORD                 dwRecordIndex,
                                         [in]  BYTE                  bTag,
                                         [in, out, AM_ANNOTATION("__inout_opt")]  DWORD * pdwCookie,
                                         [out] IGenericDescriptor ** ppDescriptor);

        HRESULT RegisterForNextTable([in]  HANDLE hNextTableAvailable);

        HRESULT GetNextTable([out] IDVB_SDT ** ppSDT);

        HRESULT RegisterForWhenCurrent([in] HANDLE hNextTableIsCurrent);

        HRESULT ConvertNextToCurrent(void);

        HRESULT GetVersionHash([out] DWORD * pdwVersionHash);
    };

    ////////////////////////////////////
    //
    // IISDB_SDT Interface
    // Support user_defined_flags field
    //
    ////////////////////////////////////

    [
        AM_LOCAL
        object,
        uuid(3F3DC9A2-BB32-4FB9-AE9E-D856848927A3),
        pointer_default(unique)
    ]
    interface IISDB_SDT : IDVB_SDT
    // Additional field for ISDB
    {
        HRESULT GetRecordEITUserDefinedFlags([in] DWORD  dwRecordIndex,
                                             [out] BYTE * pbVal);
    }


    ////////////////////////////////////
    //
    // IDVB_EIT Interface
    //
    ////////////////////////////////////

    [
        AM_LOCAL
        object,
        uuid(442DB029-02CB-4495-8B92-1C13375BCE99),
        pointer_default(unique)
    ]
    interface IDVB_EIT : IUnknown
    {
        HRESULT Initialize([in] ISectionList * pSectionList,
                           [in] IMpeg2Data *   pMPEGData);

        HRESULT GetVersionNumber([out] BYTE * pbVal);

        HRESULT GetServiceId([out] WORD * pwVal);

        HRESULT GetTransportStreamId([out] WORD * pwVal);

        HRESULT GetOriginalNetworkId([out] WORD * pwVal);

        HRESULT GetSegmentLastSectionNumber([out] BYTE * pbVal);

        HRESULT GetLastTableId([out] BYTE * pbVal);

        HRESULT GetCountOfRecords([out] DWORD * pdwVal);

        HRESULT GetRecordEventId([in]  DWORD  dwRecordIndex,
                                 [out] WORD * pwVal);

        HRESULT GetRecordStartTime([in]  DWORD                dwRecordIndex,
                                   [out] MPEG_DATE_AND_TIME * pmdtVal);

        HRESULT GetRecordDuration([in]  DWORD           dwRecordIndex,
                                  [out] MPEG_DURATION * pmdVal);

        HRESULT GetRecordRunningStatus([in]  DWORD  dwRecordIndex,
                                       [out] BYTE * pbVal);

        HRESULT GetRecordFreeCAMode([in]  DWORD  dwRecordIndex,
                                    [out] BOOL * pfVal);

        HRESULT GetRecordCountOfDescriptors([in]  DWORD   dwRecordIndex,
                                            [out] DWORD * pdwVal);

        HRESULT GetRecordDescriptorByIndex([in]  DWORD                 dwRecordIndex,
                                           [in]  DWORD                 dwIndex,
                                           [out] IGenericDescriptor ** ppDescriptor);

        HRESULT GetRecordDescriptorByTag([in]  DWORD                 dwRecordIndex,
                                         [in]  BYTE                  bTag,
                                         [in, out, AM_ANNOTATION("__inout_opt")]  DWORD * pdwCookie,
                                         [out] IGenericDescriptor ** ppDescriptor);

        HRESULT RegisterForNextTable([in] HANDLE hNextTableAvailable);

        HRESULT GetNextTable([out] IDVB_EIT ** ppEIT);

        HRESULT RegisterForWhenCurrent([in] HANDLE hNextTableIsCurrent);

        HRESULT ConvertNextToCurrent(void);

        HRESULT GetVersionHash([out] DWORD * pdwVersionHash);
    };


    ////////////////////////////////////
    //
    // IDVB_EIT2 Interface
    //
    ////////////////////////////////////

    [
        AM_LOCAL
        object,
        uuid(61A389E0-9B9E-4ba0-AEEA-5DDD159820EA),
        pointer_default(unique)
    ]
    interface IDVB_EIT2 : IDVB_EIT
    {
        HRESULT GetSegmentInfo([out] BYTE * pbTid,
                               [out] BYTE * pbSegment);

        HRESULT GetRecordSection([in]  DWORD   dwRecordIndex,
                                 [out] BYTE  * pbVal);
    };



    ////////////////////////////////////
    //
    // IDVB_BAT Interface
    //
    ////////////////////////////////////

    [
        AM_LOCAL
        object,
        uuid(ECE9BB0C-43B6-4558-A0EC-1812C34CD6CA),
        pointer_default(unique)
    ]
    interface IDVB_BAT : IUnknown
    {
        HRESULT Initialize([in] ISectionList * pSectionList,
                           [in] IMpeg2Data *   pMPEGData);

        HRESULT GetVersionNumber([out] BYTE * pbVal);

        HRESULT GetBouquetId([out] WORD * pwVal);

        HRESULT GetCountOfTableDescriptors([out] DWORD * pdwVal);

        HRESULT GetTableDescriptorByIndex([in] DWORD                 dwIndex,
                                          [in] IGenericDescriptor ** ppDescriptor);

        HRESULT GetTableDescriptorByTag([in]  BYTE                  bTag,
                                        [in, out, AM_ANNOTATION("__inout_opt")]  DWORD * pdwCookie,
                                        [out] IGenericDescriptor ** ppDescriptor);

        HRESULT GetCountOfRecords([out] DWORD * pdwVal);

        HRESULT GetRecordTransportStreamId([in]  DWORD  dwRecordIndex,
                                           [out] WORD * pwVal);

        HRESULT GetRecordOriginalNetworkId([in]  DWORD  dwRecordIndex,
                                           [out] WORD * pwVal);

        HRESULT GetRecordCountOfDescriptors([in]  DWORD   dwRecordIndex,
                                            [out] DWORD * pdwVal);

        HRESULT GetRecordDescriptorByIndex([in]  DWORD                 dwRecordIndex,
                                           [in]  DWORD                 dwIndex,
                                           [out] IGenericDescriptor ** ppDescriptor);

        HRESULT GetRecordDescriptorByTag([in]  DWORD                 dwRecordIndex,
                                         [in]  BYTE                  bTag,
                                         [in, out, AM_ANNOTATION("__inout_opt")]  DWORD * pdwCookie,
                                         [out] IGenericDescriptor ** ppDescriptor);

        HRESULT RegisterForNextTable([in]  HANDLE hNextTableAvailable);

        HRESULT GetNextTable([out] IDVB_BAT ** ppBAT);

        HRESULT RegisterForWhenCurrent([in]  HANDLE hNextTableIsCurrent);

        HRESULT ConvertNextToCurrent(void);
    };



    ////////////////////////////////////
    //
    // IDVB_RST Interface
    //
    ////////////////////////////////////

    [
        AM_LOCAL
        object,
        uuid(F47DCD04-1E23-4fb7-9F96-B40EEAD10B2B),
        pointer_default(unique)
    ]
    interface IDVB_RST : IUnknown
    {
        HRESULT Initialize([in] ISectionList * pSectionList);

        HRESULT GetCountOfRecords([out] DWORD * pdwVal);

        HRESULT GetRecordTransportStreamId([in]  DWORD  dwRecordIndex,
                                           [out] WORD * pwVal);

        HRESULT GetRecordOriginalNetworkId([in]  DWORD  dwRecordIndex,
                                           [out] WORD * pwVal);

        HRESULT GetRecordServiceId([in]  DWORD  dwRecordIndex,
                                   [out] WORD * pwVal);

        HRESULT GetRecordEventId([in]  DWORD  dwRecordIndex,
                                 [out] WORD * pwVal);

        HRESULT GetRecordRunningStatus([in]  DWORD  dwRecordIndex,
                                       [out] BYTE * pbVal);
    };



    ////////////////////////////////////
    //
    // IDVB_ST Interface
    //
    ////////////////////////////////////

    [
        AM_LOCAL
        object,
        uuid(4D5B9F23-2A02-45de-BCDA-5D5DBFBFBE62),   
        pointer_default(unique)
    ]
    interface IDVB_ST : IUnknown
    {
        HRESULT Initialize([in] ISectionList * pSectionList);

        HRESULT GetDataLength([out] WORD * pwVal);

        HRESULT GetData([out] BYTE ** ppData);
    };



    ////////////////////////////////////
    //
    // IDVB_TDT Interface
    //
    ////////////////////////////////////

    [
        AM_LOCAL
        object,
        uuid(0780DC7D-D55C-4aef-97E6-6B75906E2796),
        pointer_default(unique)
    ]
    interface IDVB_TDT : IUnknown
    {
        HRESULT Initialize([in] ISectionList * pSectionList);
     
        HRESULT GetUTCTime([out] MPEG_DATE_AND_TIME * pmdtVal);
    };



    ////////////////////////////////////
    //
    // IDVB_TOT Interface
    //
    ////////////////////////////////////

    [
        AM_LOCAL
        object,
        uuid(83295D6A-FABA-4ee1-9B15-8067696910AE),
        pointer_default(unique)
    ]
    interface IDVB_TOT : IUnknown
    {
        HRESULT Initialize([in] ISectionList * pSectionList);

        HRESULT GetUTCTime([out] MPEG_DATE_AND_TIME * pmdtVal);

        HRESULT GetCountOfTableDescriptors([out] DWORD * pdwVal);

        HRESULT GetTableDescriptorByIndex([in]  DWORD                 dwIndex,
                                          [out] IGenericDescriptor ** ppDescriptor);

        HRESULT GetTableDescriptorByTag([in]      BYTE                  bTag,
                                        [in, out, AM_ANNOTATION("__inout_opt")] DWORD * pdwCookie,
                                        [out]     IGenericDescriptor ** ppDescriptor);
    };



    ////////////////////////////////////
    //
    // IDVB_DIT Interface
    //
    ////////////////////////////////////

    [
        AM_LOCAL
        object,
        uuid(91BFFDF9-9432-410f-86EF-1C228ED0AD70),
        pointer_default(unique)
    ]
    interface IDVB_DIT : IUnknown
    {
        HRESULT Initialize([in] ISectionList * pSectionList);

        HRESULT GetTransitionFlag([out] BOOL * pfVal);
    };



    ////////////////////////////////////
    //
    // IDVB_SIT Interface
    //
    ////////////////////////////////////

    [
        AM_LOCAL
        object,
        uuid(68CDCE53-8BEA-45c2-9D9D-ACF575A089B5),
        pointer_default(unique)
    ]
    interface IDVB_SIT : IUnknown
    {
        HRESULT Initialize([in] ISectionList * pSectionList,
                           [in] IMpeg2Data *   pMPEGData);

        HRESULT GetVersionNumber([out] BYTE * pbVal);

        HRESULT GetCountOfTableDescriptors([out] DWORD * pdwVal);

        HRESULT GetTableDescriptorByIndex([in]  DWORD                 dwIndex,
                                          [out] IGenericDescriptor ** ppDescriptor);

        HRESULT GetTableDescriptorByTag([in]  BYTE                  bTag,
                                        [in, out, AM_ANNOTATION("__inout_opt")]  DWORD * pdwCookie,
                                        [out] IGenericDescriptor ** ppDescriptor);

        HRESULT GetCountOfRecords([out] DWORD * pdwVal);

        HRESULT GetRecordServiceId([in]  DWORD  dwRecordIndex,
                                   [out] WORD * pwVal);

        HRESULT GetRecordRunningStatus([in]  DWORD  dwRecordIndex,
                                       [out] BYTE * pbVal);

        HRESULT GetRecordCountOfDescriptors([in]  DWORD   dwRecordIndex,
                                            [out] DWORD * pdwVal);

        HRESULT GetRecordDescriptorByIndex([in]  DWORD                 dwRecordIndex,
                                           [in]  DWORD                 dwIndex,
                                           [out] IGenericDescriptor ** ppDescriptor);

        HRESULT GetRecordDescriptorByTag([in]  DWORD                 dwRecordIndex,
                                         [in]  BYTE                  bTag,
                                         [in, out, AM_ANNOTATION("__inout_opt")]  DWORD * pdwCookie,
                                         [out] IGenericDescriptor ** ppDescriptor);

        HRESULT RegisterForNextTable([in] HANDLE hNextTableAvailable);

        HRESULT GetNextTable([in]  DWORD       dwTimeout,
                             [out] IDVB_SIT ** ppSIT);

        HRESULT RegisterForWhenCurrent([in] HANDLE hNextTableIsCurrent);

        HRESULT ConvertNextToCurrent(void);
    };



    ////////////////////////////////////
    //
    // IISDB_BIT Interface
    //
    ////////////////////////////////////

    [
        AM_LOCAL
        object,
        uuid(537CD71E-0E46-4173-9001-BA043F3E49E2),
        pointer_default(unique)
    ]
    interface IISDB_BIT : IUnknown
    {
        HRESULT Initialize([in] ISectionList * pSectionList,
                           [in] IMpeg2Data *   pMPEGData);

        HRESULT GetVersionNumber([out] BYTE * pbVal);

        HRESULT GetOriginalNetworkId([out] WORD * pwVal);

        HRESULT GetBroadcastViewPropriety([out] BYTE * pbVal);

        HRESULT GetCountOfTableDescriptors([out] DWORD * pdwVal);

        HRESULT GetTableDescriptorByIndex([in] DWORD dwIndex,
                                          [out] IGenericDescriptor ** ppDescriptor);

        HRESULT GetTableDescriptorByTag([in] BYTE bTag,
                                        [in, out, AM_ANNOTATION("__inout_opt")] DWORD * pdwCookie,
                                        [out] IGenericDescriptor ** ppDescriptor);

        HRESULT GetCountOfRecords([out] DWORD * pdwVal);

        HRESULT GetRecordBroadcasterId([in] DWORD dwRecordIndex,
                                       [out] BYTE * pbVal);

        HRESULT GetRecordCountOfDescriptors([in] DWORD dwRecordIndex,
                                            [out] DWORD * pdwVal);

        HRESULT GetRecordDescriptorByIndex([in] DWORD dwRecordIndex,
                                           [in] DWORD dwIndex,
                                           [out] IGenericDescriptor ** ppDescriptor);

        HRESULT GetRecordDescriptorByTag([in] DWORD dwRecordIndex,
                                         [in] BYTE bTag,
                                         [in,out, AM_ANNOTATION("__inout_opt")] DWORD * pdwCookie,
                                         [out] IGenericDescriptor ** ppDescriptor);

        HRESULT GetVersionHash([out] DWORD * pdwVersionHash);
    };



    ////////////////////////////////////
    //
    // IISDB_NBIT Interface
    //
    ////////////////////////////////////

    [
        AM_LOCAL
        object,
        uuid(1B1863EF-08F1-40B7-A559-3B1EFF8CAFA6),
        pointer_default(unique)
    ]
    interface IISDB_NBIT : IUnknown
    {
        HRESULT Initialize([in] ISectionList * pSectionList,
                           [in] IMpeg2Data * pMPEGData);

        HRESULT GetVersionNumber([out] BYTE * pbVal);

        HRESULT GetOriginalNetworkId([out] WORD * pwVal);

        HRESULT GetCountOfRecords([out] DWORD * pdwVal);

        HRESULT GetRecordInformationId([in] DWORD dwRecordIndex,
                                       [out] WORD * pwVal);

        HRESULT GetRecordInformationType([in] DWORD dwRecordIndex,
                                         [out] BYTE * pbVal);

        HRESULT GetRecordDescriptionBodyLocation([in] DWORD dwRecordIndex,
                                                 [out] BYTE * pbVal);

        HRESULT GetRecordMessageSectionNumber([in] DWORD dwRecordIndex,
                                              [out] BYTE * pbVal);

        HRESULT GetRecordUserDefined([in] DWORD dwRecordIndex,
                                     [out] BYTE * pbVal);

        HRESULT GetRecordNumberOfKeys([in] DWORD dwRecordIndex,
                                      [out] BYTE * pbVal);

        HRESULT GetRecordKeys([in] DWORD dwRecordIndex,
                              [out] BYTE ** pbKeys);

        HRESULT GetRecordCountOfDescriptors([in] DWORD dwRecordIndex,
                                            [out] DWORD * pdwVal);

        HRESULT GetRecordDescriptorByIndex([in] DWORD dwRecordIndex,
                                           [in] DWORD dwIndex,
                                           [out] IGenericDescriptor ** ppDescriptor);

        HRESULT GetRecordDescriptorByTag([in] DWORD dwRecordIndex,
                                         [in] BYTE bTag,
                                         [in, out,  AM_ANNOTATION("__inout_opt")] DWORD * pdwCookie,
                                         [out] IGenericDescriptor ** ppDescriptor);

        HRESULT GetVersionHash([out] DWORD * pdwVersionHash);
    };



    ////////////////////////////////////
    //
    // IISDB_LDT Interface
    //
    ////////////////////////////////////

    [
        AM_LOCAL
        object,
        uuid(141A546B-02FF-4FB9-A3A3-2F074B74A9A9),
        pointer_default(unique)
    ]
    interface IISDB_LDT : IUnknown
    {
        HRESULT Initialize([in] ISectionList * pSectionList,
                           [in] IMpeg2Data * pMPEGData);

        HRESULT GetVersionNumber([out] BYTE * pbVal);

        HRESULT GetOriginalServiceId([out] WORD * pwVal);

        HRESULT GetTransportStreamId([out] WORD * pwVal);

        HRESULT GetOriginalNetworkId([out] WORD * pwVal);

        HRESULT GetCountOfRecords([out] DWORD * pdwVal);

        HRESULT GetRecordDescriptionId([in] DWORD dwRecordIndex,
                                       [out] WORD * pwVal);

        HRESULT GetRecordCountOfDescriptors([in] DWORD dwRecordIndex,
                                            [out] DWORD * pdwVal);

        HRESULT GetRecordDescriptorByIndex([in] DWORD dwRecordIndex,
                                           [in] DWORD dwIndex,
                                           [out] IGenericDescriptor ** ppDescriptor);

        HRESULT GetRecordDescriptorByTag([in] DWORD dwRecordIndex,
                                         [in] BYTE bTag,
                                         [in, out, AM_ANNOTATION("__inout_opt")] DWORD * pdwCookie,
                                         [out] IGenericDescriptor ** ppDescriptor);

        HRESULT GetVersionHash([out] DWORD * pdwVersionHash);
    };



    ////////////////////////////////////
    //
    // IISDB_SDTT Interface
    //
    ////////////////////////////////////

    [
        AM_LOCAL
        object,
        uuid(EE60EF2D-813A-4DC7-BF92-EA13DAC85313),
        pointer_default(unique)
    ]
    interface IISDB_SDTT : IUnknown
    {
        HRESULT Initialize([in] ISectionList * pSectionList,
                           [in] IMpeg2Data * pMPEGData);

        HRESULT GetVersionNumber([out] BYTE * pbVal);

        HRESULT GetTableIdExt([out] WORD * pwVal);

        HRESULT GetTransportStreamId([out] WORD * pwVal);

        HRESULT GetOriginalNetworkId([out] WORD * pwVal);

        HRESULT GetServiceId([out] WORD * pwVal);

        HRESULT GetCountOfRecords([out] DWORD * pdwVal);

        HRESULT GetRecordGroup([in] DWORD  dwRecordIndex,
                               [out] BYTE * pbVal);

        HRESULT GetRecordTargetVersion([in] DWORD  dwRecordIndex,
                                       [out] WORD * pwVal);

        HRESULT GetRecordNewVersion([in] DWORD  dwRecordIndex,
                                    [out] WORD * pwVal);

        HRESULT GetRecordDownloadLevel([in] DWORD  dwRecordIndex,
                                       [out] BYTE * pbVal);

        HRESULT GetRecordVersionIndicator([in] DWORD  dwRecordIndex,
                                          [out] BYTE * pbVal);

        HRESULT GetRecordScheduleTimeShiftInformation([in] DWORD  dwRecordIndex,
                                                      [out] BYTE * pbVal);

        HRESULT GetRecordCountOfSchedules([in] DWORD dwRecordIndex,
                                          [out] DWORD * pdwVal);

        HRESULT GetRecordStartTimeByIndex([in] DWORD dwRecordIndex,
                                          [in] DWORD dwIndex,
                                          [out] MPEG_DATE_AND_TIME * pmdtVal);

        HRESULT GetRecordDurationByIndex([in] DWORD dwRecordIndex,
                                         [in] DWORD dwIndex,
                                         [out] MPEG_DURATION * pmdVal);

        HRESULT GetRecordCountOfDescriptors([in] DWORD dwRecordIndex,
                                            [out] DWORD * pdwVal);

        HRESULT GetRecordDescriptorByIndex([in] DWORD dwRecordIndex,
                                           [in] DWORD dwIndex,
                                           [out] IGenericDescriptor ** ppDescriptor);

        HRESULT GetRecordDescriptorByTag([in] DWORD  dwRecordIndex,
                                         [in] BYTE bTag,
                                         [in, out, AM_ANNOTATION("__inout_opt")] DWORD * pdwCookie,
                                         [out] IGenericDescriptor ** ppDescriptor);

        HRESULT GetVersionHash([out] DWORD * pdwVersionHash);
    };



    ////////////////////////////////////
    //
    // IISDB_CDT Interface
    //
    ////////////////////////////////////

    [
        AM_LOCAL
        object,
        uuid(25FA92C2-8B80-4787-A841-3A0E8F17984B),
        pointer_default(unique)
    ]
    interface IISDB_CDT : IUnknown
    {
        HRESULT Initialize([in] ISectionList * pSectionList,
                           [in] IMpeg2Data *   pMPEGData,
                           [in] BYTE           bSectionNumber);

        HRESULT GetVersionNumber([out] BYTE * pbVal);

        HRESULT GetDownloadDataId([out] WORD * pwVal);

        HRESULT GetSectionNumber([out] BYTE * pbVal);
        
        HRESULT GetOriginalNetworkId([out] WORD * pwVal);

        HRESULT GetDataType([out] BYTE * pbVal);

        HRESULT GetCountOfTableDescriptors([out] DWORD * pdwVal);

        HRESULT GetTableDescriptorByIndex([in]  DWORD                 dwIndex,
                                          [out] IGenericDescriptor ** ppDescriptor);

        HRESULT GetTableDescriptorByTag([in] BYTE bTag,
                                        [in, out, AM_ANNOTATION("__inout_opt")] DWORD * pdwCookie,
                                        [out] IGenericDescriptor ** ppDescriptor);

        HRESULT GetSizeOfDataModule([out] DWORD * pdwVal);
        
        HRESULT GetDataModule([out] BYTE ** pbData);

        HRESULT GetVersionHash([out] DWORD * pdwVersionHash);
    };



    ////////////////////////////////////
    //
    // IISDB_EMM Interface
    //
    ////////////////////////////////////

    [
        AM_LOCAL
        object,
        uuid(0EDB556D-43AD-4938-9668-321B2FFECFD3),
        pointer_default(unique)
    ]
    interface IISDB_EMM : IUnknown
    {
        HRESULT Initialize([in] ISectionList * pSectionList,
                           [in] IMpeg2Data *   pMPEGData);

        HRESULT GetVersionNumber([out] BYTE * pbVal);

        HRESULT GetTableIdExtension([out] WORD * pwVal);

        HRESULT GetDataBytes(
            [in, out] WORD * pwBufferLength,    // retuen reqired buffer length if pbBuffer is null.
            [out]     BYTE * pbBuffer
        );

        HRESULT GetSharedEmmMessage(
            /*[out]*/ WORD * pwLength,
            /*[out]*/ BYTE ** ppbMessage);      // If this method succeeds, the client must release by CoTaskMemFree 

        HRESULT GetIndividualEmmMessage(
            /*[in]*/  IUnknown * pUnknown,
            /*[out]*/ WORD * pwLength,
            /*[out]*/ BYTE ** ppbMessage);      // If this method succeeds, the client must release by CoTaskMemFree

        HRESULT GetVersionHash([out] DWORD * pdwVersionHash);
    };



    ////////////////////////////////////
    //
    // IDvbServiceAttributeDescriptor Interface
    //
    ////////////////////////////////////

    [
        AM_LOCAL
        object,
        uuid(0F37BD92-D6A1-4854-B950-3A969D27F30E),
        pointer_default(unique)
    ]
    interface IDvbServiceAttributeDescriptor : IUnknown
    {
        HRESULT GetTag([out] BYTE * pbVal);

        HRESULT GetLength([out] BYTE * pbVal);

        HRESULT GetCountOfRecords([out] BYTE * pbVal);

        HRESULT GetRecordServiceId([in]  BYTE   bRecordIndex,
                                   [out] WORD * pwVal);

        HRESULT GetRecordNumericSelectionFlag([in]  BYTE   bRecordIndex,
                                              [out] BOOL * pfVal);

        HRESULT GetRecordVisibleServiceFlag([in]  BYTE   bRecordIndex,
                                            [out] BOOL * pfVal);
    };



    ////////////////////////////////////
    //
    // IDvbContentIdentifierDescriptor Interface
    //
    ////////////////////////////////////

    typedef enum
    {
        CRID_LOCATION_IN_DESCRIPTOR = 0x0,
        CRID_LOCATION_IN_CIT        = 0x1,
        CRID_LOCATION_DVB_RESERVED1 = 0x2,
        CRID_LOCATION_DVB_RESERVED2 = 0x3,

    } CRID_LOCATION;

    [
        AM_LOCAL
        object,
        uuid(05E0C1EA-F661-4053-9FBF-D93B28359838),
        pointer_default(unique)
    ]
    interface IDvbContentIdentifierDescriptor : IUnknown
    {
        HRESULT GetTag([out] BYTE * pbVal);

        HRESULT GetLength([out] BYTE * pbVal);

        HRESULT GetCountOfRecords([out] BYTE * pbVal);

        HRESULT GetRecordCrid([in]  BYTE    bRecordIndex,
                              [out] BYTE *  pbType,
                              [out] BYTE *  pbLocation,
                              [out] BYTE *  pbLength,
                              [out, size_is( , *pbLength)] BYTE ** ppbBytes);
    };



    ////////////////////////////////////
    //
    // IDvbDefaultAuthorityDescriptor Interface
    //
    ////////////////////////////////////

    [
        AM_LOCAL
        object,
        uuid(05EC24D1-3A31-44e7-B408-67C60A352276),
        pointer_default(unique)
    ]
    interface IDvbDefaultAuthorityDescriptor : IUnknown
    {
        HRESULT GetTag([out] BYTE * pbVal);

        HRESULT GetLength([out] BYTE * pbVal);

        HRESULT GetDefaultAuthority([out] BYTE *  pbLength,
                                    [out, size_is( , *pbLength)] BYTE ** ppbBytes);
    };



    ////////////////////////////////////
    //
    // IDvbSatelliteDeliverySystemDescriptor Interface
    //
    ////////////////////////////////////

    [
        AM_LOCAL
        object,
        uuid(02F2225A-805B-4ec5-A9A6-F9B5913CD470),
        pointer_default(unique)
    ]
    interface IDvbSatelliteDeliverySystemDescriptor : IUnknown
    {
        HRESULT GetTag([out] BYTE * pbVal);

        HRESULT GetLength([out] BYTE * pbVal);

        HRESULT GetFrequency([out] DWORD * pdwVal);

        HRESULT GetOrbitalPosition([out] WORD * pwVal);

        HRESULT GetWestEastFlag([out] BYTE * pbVal);

        HRESULT GetPolarization([out] BYTE * pbVal);

        HRESULT GetModulation([out] BYTE * pbVal);

        HRESULT GetSymbolRate([out] DWORD * pdwVal);

        HRESULT GetFECInner([out] BYTE * pbVal);
    };



    ////////////////////////////////////
    //
    // IDvbCableDeliverySystemDescriptor Interface
    //
    ////////////////////////////////////

    [
        AM_LOCAL
        object,
        uuid(DFB98E36-9E1A-4862-9946-993A4E59017B),
        pointer_default(unique)
    ]
    interface IDvbCableDeliverySystemDescriptor : IUnknown
    {
        HRESULT GetTag([out] BYTE * pbVal);

        HRESULT GetLength([out] BYTE * pbVal);

        HRESULT GetFrequency([out] DWORD * pdwVal);

        HRESULT GetFECOuter([out] BYTE * pbVal);

        HRESULT GetModulation([out] BYTE * pbVal);

        HRESULT GetSymbolRate([out] DWORD * pdwVal);

        HRESULT GetFECInner([out] BYTE * pbVal);
    };



    ////////////////////////////////////
    //
    // IDvbTerrestrialDeliverySystemDescriptor Interface
    //
    ////////////////////////////////////

    [
        AM_LOCAL
        object,
        uuid(ED7E1B91-D12E-420c-B41D-A49D84FE1823),
        pointer_default(unique)
    ]
    interface IDvbTerrestrialDeliverySystemDescriptor : IUnknown
    {
        HRESULT GetTag([out] BYTE * pbVal);

        HRESULT GetLength([out] BYTE * pbVal);

        HRESULT GetCentreFrequency([out] DWORD * pdwVal);

        HRESULT GetBandwidth([out] BYTE * pbVal);

        HRESULT GetConstellation([out] BYTE * pbVal);

        HRESULT GetHierarchyInformation([out] BYTE * pbVal);

        HRESULT GetCodeRateHPStream([out] BYTE * pbVal);

        HRESULT GetCodeRateLPStream([out] BYTE * pbVal);

        HRESULT GetGuardInterval([out] BYTE * pbVal);

        HRESULT GetTransmissionMode([out] BYTE * pbVal);

        HRESULT GetOtherFrequencyFlag([out] BYTE * pbVal);
    };

    ////////////////////////////////////
    //
    // IDvbTerrestrial2DeliverySystemDescriptor Interface
    //
    ////////////////////////////////////

    [
        AM_LOCAL
        object,
        uuid(20EE9BE9-CD57-49ab-8F6E-1D07AEB8E482),
        pointer_default(unique)
    ]
    interface IDvbTerrestrial2DeliverySystemDescriptor : IUnknown
    {
        HRESULT GetTag([out] BYTE * pbVal);

        HRESULT GetLength([out] BYTE * pbVal);

        HRESULT GetTagExtension([out] BYTE * pbVal);

        HRESULT GetCentreFrequency([out] DWORD * pdwVal);

        HRESULT GetPLPId([out] BYTE * pbVal);

        HRESULT GetT2SystemId([out] WORD * pwVal);

        HRESULT GetMultipleInputMode([out] BYTE * pbVal);

        HRESULT GetBandwidth([out] BYTE * pbVal);

        HRESULT GetGuardInterval([out] BYTE * pbVal);

        HRESULT GetTransmissionMode([out] BYTE * pbVal);

        HRESULT GetCellId([out] WORD * pwVal);

        HRESULT GetOtherFrequencyFlag([out] BYTE * pbVal);

        HRESULT GetTFSFlag([out] BYTE * pbVal);

    };


    ////////////////////////////////////
    //
    // IDvbFrequencyListDescriptor Interface
    //
    ////////////////////////////////////

    [
        AM_LOCAL
        object,
        uuid(1CADB613-E1DD-4512-AFA8-BB7A007EF8B1),
        pointer_default(unique)
    ]
    interface IDvbFrequencyListDescriptor : IUnknown
    {
        HRESULT GetTag([out] BYTE * pbVal);

        HRESULT GetLength([out] BYTE * pbVal);

        HRESULT GetCodingType([out] BYTE * pbVal);

        HRESULT GetCountOfRecords([out] BYTE * pbVal);

        HRESULT GetRecordCentreFrequency([in]  BYTE    bRecordIndex,
                                         [out] DWORD * pdwVal);
    };



    ////////////////////////////////////
    //
    // IDvbPrivateDataSpecifierDescriptor Interface
    //
    ////////////////////////////////////

    [
        AM_LOCAL
        object,
        uuid(5660A019-E75A-4b82-9B4C-ED2256D165A2),
        pointer_default(unique)
    ]
    interface IDvbPrivateDataSpecifierDescriptor : IUnknown
    {
        HRESULT GetTag([out] BYTE * pbVal);

        HRESULT GetLength([out] BYTE * pbVal);

        HRESULT GetPrivateDataSpecifier([out] DWORD * pdwVal);
    };



    ////////////////////////////////////
    //
    // IDvbLogicalChannelDescriptor Interface
    //
    ////////////////////////////////////

    [
        AM_LOCAL
        object,
        uuid(CF1EDAFF-3FFD-4cf7-8201-35756ACBF85F),
        pointer_default(unique)
    ]
    interface IDvbLogicalChannelDescriptor : IUnknown
    {
        HRESULT GetTag([out] BYTE * pbVal);

        HRESULT GetLength([out] BYTE * pbVal);

        HRESULT GetCountOfRecords([out] BYTE * pbVal);

        HRESULT GetRecordServiceId([in]  BYTE   bRecordIndex,
                                   [out] WORD * pwVal);

        HRESULT GetRecordLogicalChannelNumber([in]  BYTE   bRecordIndex,
                                              [out] WORD * pwVal);
    };



    ////////////////////////////////////
    //
    // IDvbLogicalChannelDescriptor2 Interface.
    //
    // Extension to the IDvbLogicalChannelDescriptor 
    // interface to also return channel visibility
    //
    ////////////////////////////////////

    [
        AM_LOCAL
        object,
        uuid(43ACA974-4BE8-4b98-BC17-9EAFD788B1D7),
        pointer_default(unique)
    ]
    interface IDvbLogicalChannelDescriptor2 : IDvbLogicalChannelDescriptor
    {
        HRESULT GetRecordLogicalChannelAndVisibility([in]  BYTE   bRecordIndex,
                                                     [out] WORD * pwVal);
    };



    ////////////////////////////////////
    //
    // IDvbLogicalChannel2Descriptor Interface
    //
    // Extension to the IDvbLogicalChannelDescriptor2 to implement fields
    // available in version 2 of the DVB Logical Channel descriptor. 
    //
    ////////////////////////////////////

    [
        AM_LOCAL
        object,
        uuid(F69C3747-8A30-4980-998C-01FE7F0BA35A),
        pointer_default(unique)
    ]
    interface IDvbLogicalChannel2Descriptor : IDvbLogicalChannelDescriptor2
    {
        HRESULT GetCountOfLists([out] BYTE * pbVal);

        HRESULT GetListId([in]  BYTE   bListIndex,
                          [out] BYTE * pbVal);

        HRESULT GetListNameW([in]  BYTE             bListIndex,
                             [in]  DVB_STRCONV_MODE convMode,
                             [out] BSTR *           pbstrName);

        HRESULT GetListCountryCode([in]  BYTE   bListIndex,
                                   [out AM_ANNOTATION("__out_ecount(4)")] char * pszCode);

        HRESULT GetListCountOfRecords([in]  BYTE   bChannelListIndex,
                                      [out] BYTE * pbVal); 

        HRESULT GetListRecordServiceId([in]  BYTE   bListIndex,
                                       [in]  BYTE   bRecordIndex,
                                       [out] WORD * pwVal);

        HRESULT GetListRecordLogicalChannelNumber([in]  BYTE   bListIndex,
                                                  [in]  BYTE   bRecordIndex,
                                                  [out] WORD * pwVal);

        HRESULT GetListRecordLogicalChannelAndVisibility([in]  BYTE   bListIndex,
                                                         [in]  BYTE   bRecordIndex,
                                                         [out] WORD * pwVal);
    };



    ////////////////////////////////////
    //
    // IDvbHDSimulcastLogicalChannelDescriptor Interface
    //
    ////////////////////////////////////

    [
        AM_LOCAL
        object,
        uuid(1EA8B738-A307-4680-9E26-D0A908C824F4),
        pointer_default(unique)
    ]
    interface IDvbHDSimulcastLogicalChannelDescriptor : IDvbLogicalChannelDescriptor2
    {
        // Identical to IDvbLogicalChannelDescriptor2
    };



    ////////////////////////////////////
    //
    // IDvbDataBroadcastIDDescriptor Interface
    //
    ////////////////////////////////////

    [
        AM_LOCAL
        object,
        uuid(5F26F518-65C8-4048-91F2-9290F59F7B90),
        pointer_default(unique)
    ]
    interface IDvbDataBroadcastIDDescriptor : IUnknown
    {
        HRESULT GetTag([out] BYTE * pbVal);

        HRESULT GetLength([out] BYTE * pbVal);

        HRESULT GetDataBroadcastID([out] WORD * pwVal);

        HRESULT GetIDSelectorBytes([in, out] BYTE * pbLen, [out] BYTE * pbVal);
    };

    ////////////////////////////////////
    //
    // IDvbDataBroadcastDescriptor Interface
    //
    ////////////////////////////////////

    [
        AM_LOCAL
        object,
        uuid(D1EBC1D6-8B60-4c20-9CAF-E59382E7C400),
        pointer_default(unique)
    ]
    interface IDvbDataBroadcastDescriptor : IUnknown
    {
        HRESULT GetTag([out] BYTE * pbVal);

        HRESULT GetLength([out] BYTE * pbVal);

        HRESULT GetDataBroadcastID([out] WORD * pwVal);

        HRESULT GetComponentTag([out] BYTE * pbVal);

        HRESULT GetSelectorLength([out] BYTE * pbVal);

        HRESULT GetSelectorBytes([in, out] BYTE *pbLen, [out] BYTE * pbVal);

        HRESULT GetLangID([out] ULONG * pulVal);

        HRESULT GetTextLength([out] BYTE * pbVal);

        HRESULT GetText([in, out] BYTE *pbLen, [out] BYTE * pbVal);
    };

typedef enum
{
    DESC_LINKAGE_RESERVED0 = 0x00,
    DESC_LINKAGE_INFORMATION,
    DESC_LINKAGE_EPG,
    DESC_LINKAGE_CA_REPLACEMENT,
    DESC_LINKAGE_COMPLETE_NET_BOUQUET_SI,
    DESC_LINKAGE_REPLACEMENT,
    DESC_LINKAGE_DATA,
    DESC_LINKAGE_RESERVED1 = 0x07,
    DESC_LINKAGE_USER = 0x08,
    DESC_LINKAGE_RESERVED2 = 0xFF

} DESC_LINKAGE_TYPE;

    ////////////////////////////////////
    //
    // IDvbLinkageDescriptor Interface
    //
    ////////////////////////////////////

    [
        AM_LOCAL
        object,
        uuid(1CDF8B31-994A-46fc-ACFD-6A6BE8934DD5),    
        pointer_default(unique)
    ]
    interface IDvbLinkageDescriptor : IUnknown
    {
        HRESULT GetTag([out] BYTE * pbVal);

        HRESULT GetLength([out] BYTE * pbVal);

        HRESULT GetTSId([out] WORD * pwVal);

        HRESULT GetONId([out] WORD * pwVal);

        HRESULT GetServiceId([out] WORD * pwVal);

        HRESULT GetLinkageType([out] BYTE * pbVal);

        HRESULT GetPrivateDataLength([out] BYTE * pbVal);

        HRESULT GetPrivateData([in, out] BYTE *pbLen, [out] BYTE * pbData);
    };

    ////////////////////////////////////
    //
    // IDvbTeletextDescriptor Interface
    //
    ////////////////////////////////////

    [
        AM_LOCAL
        object,
        uuid(9CD29D47-69C6-4f92-98A9-210AF1B7303A),    
        pointer_default(unique)
    ]
    interface IDvbTeletextDescriptor : IUnknown
    {
        HRESULT GetTag([out] BYTE * pbVal);

        HRESULT GetLength([out] BYTE * pbVal);

        HRESULT GetCountOfRecords([out] BYTE * pbVal);

        HRESULT GetRecordLangId([in]  BYTE   bRecordIndex,
                                   [out] ULONG * pulVal);

        HRESULT GetRecordTeletextType([in]  BYTE   bRecordIndex,
                                              [out] BYTE * pbVal);
        HRESULT GetRecordMagazineNumber([in]  BYTE   bRecordIndex,
                                              [out] BYTE * pbVal);
        HRESULT GetRecordPageNumber([in]  BYTE   bRecordIndex,
                                              [out] BYTE * pbVal);
    };

    ////////////////////////////////////
    //
    // IDvbSubtitlingDescriptor Interface
    //
    ////////////////////////////////////

    [
        AM_LOCAL
        object,
        uuid(9B25FE1D-FA23-4e50-9784-6DF8B26F8A49),    
        pointer_default(unique)
    ]
    interface IDvbSubtitlingDescriptor : IUnknown
    {
        HRESULT GetTag([out] BYTE * pbVal);

        HRESULT GetLength([out] BYTE * pbVal);

        HRESULT GetCountOfRecords([out] BYTE * pbVal);

        HRESULT GetRecordLangId([in]  BYTE   bRecordIndex,
                                   [out] ULONG * pulVal);

        HRESULT GetRecordSubtitlingType([in]  BYTE   bRecordIndex,
                                              [out] BYTE * pbVal);
        HRESULT GetRecordCompositionPageID([in]  BYTE   bRecordIndex,
                                              [out] WORD * pwVal);
        HRESULT GetRecordAncillaryPageID([in]  BYTE   bRecordIndex,
                                              [out] WORD * pwVal);
    };

    ////////////////////////////////////
    //
    // IDvbServiceDescriptor Interface
    //
    ////////////////////////////////////

    [
        AM_LOCAL
        object,
        uuid(F9C7FBCF-E2D6-464d-B32D-2EF526E49290),    
        pointer_default(unique)
    ]
    interface IDvbServiceDescriptor : IUnknown
    {
        HRESULT GetTag([out] BYTE * pbVal);

        HRESULT GetLength([out] BYTE * pbVal);

        HRESULT GetServiceType([out] BYTE * pbVal);

        HRESULT GetServiceProviderName([out AM_ANNOTATION("__deref_out")] char ** pszName);

        HRESULT GetServiceProviderNameW([out AM_ANNOTATION("__deref_out")] BSTR* pbstrName);

        HRESULT GetServiceName([out AM_ANNOTATION("__deref_out")] char ** pszName);
      
        HRESULT    GetProcessedServiceName([out] BSTR *pbstrName);
      
        HRESULT    GetServiceNameEmphasized([out] BSTR *pbstrName);
    };

    ////////////////////////////////////
    //
    // IDvbServiceDescriptor2 Interface
    // Added generic string functions
    //
    ////////////////////////////////////

    [
        AM_LOCAL
        object,
        uuid(D6C76506-85AB-487C-9B2B-36416511E4A2),
        pointer_default(unique)
    ]
    interface IDvbServiceDescriptor2 : IDvbServiceDescriptor
    {
        HRESULT GetServiceProviderNameW(
            [in]  DVB_STRCONV_MODE  convMode,
            [out] BSTR            * pbstrName);

        HRESULT GetServiceNameW(
            [in]  DVB_STRCONV_MODE  convMode,
            [out] BSTR            * pbstrName);
    };



    ////////////////////////////////////
    //
    // IDvbServiceListDescriptor Interface
    // for DVB/ISDB
    //
    ////////////////////////////////////

    [
        AM_LOCAL
        object,
        uuid(05DB0D8F-6008-491a-ACD3-7090952707D0),
        pointer_default(unique)
    ]
    interface IDvbServiceListDescriptor : IUnknown
    {
        HRESULT GetTag([out] BYTE * pbVal);

        HRESULT GetLength([out] BYTE * pbVal);

        HRESULT GetCountOfRecords([out] BYTE * pbVal);

        HRESULT GetRecordServiceId([in]  BYTE   bRecordIndex,
                                   [out] WORD * pwVal);

        HRESULT GetRecordServiceType([in]  BYTE   bRecordIndex,
                                     [out] BYTE * pbVal);
    };

    /////////////////////////////////////////////////
    //
    // IDvbMultilingualServiceNameDescriptor Interface
    //
    /////////////////////////////////////////////////

    [
        AM_LOCAL
        object,
        uuid(2D80433B-B32C-47ef-987F-E78EBB773E34),
        pointer_default(unique)
    ]
    interface IDvbMultilingualServiceNameDescriptor : IUnknown
    {
        HRESULT GetTag([out] BYTE * pbVal);

        HRESULT GetLength([out] BYTE * pbVal);

        HRESULT GetCountOfRecords([out] BYTE * pbVal);

        HRESULT GetRecordLangId ([in]  BYTE   bRecordIndex,
                                 [out] ULONG * ulVal);

        HRESULT GetRecordServiceProviderNameW(
            [in]  BYTE              bRecordIndex,
            [in]  DVB_STRCONV_MODE  convMode,
            [out] BSTR            * pbstrName);

        HRESULT GetRecordServiceNameW(
            [in]  BYTE              bRecordIndex,
            [in]  DVB_STRCONV_MODE  convMode,
            [out] BSTR            * pbstrName);
    };

    ///////////////////////////////////////////////////////////
    //
    // IDvbNetworkNameDescriptor Interface
    //
    ///////////////////////////////////////////////////////////
    [
        AM_LOCAL
        object,
        uuid(5B2A80CF-35B9-446C-B3E4-048B761DBC51),
        pointer_default(unique)
    ]
    interface IDvbNetworkNameDescriptor : IUnknown
    {
        HRESULT GetTag(
            [out] BYTE * pbVal
        );
        HRESULT GetLength(
            [out] BYTE * pbVal
        );
        HRESULT GetNetworkName(
            [out AM_ANNOTATION("__deref_out")] char ** pszName
        );
        HRESULT GetNetworkNameW(
            [in]  DVB_STRCONV_MODE  convMode,
            [out] BSTR            * pbstrName);
    };



    ///////////////////////////////////////////////////////////
    //
    // IDvbShortEventDescriptor Interface
    //
    ///////////////////////////////////////////////////////////
    [
        AM_LOCAL
        object,
        uuid(B170BE92-5B75-458E-9C6E-B0008231491A),
        pointer_default(unique)
    ]
    interface IDvbShortEventDescriptor : IUnknown
    {
        HRESULT GetTag(
            [out] BYTE * pbVal
        );
        HRESULT GetLength(
            [out] BYTE * pbVal
        );
        HRESULT GetLanguageCode(
            [out AM_ANNOTATION("__out_ecount(4)")] char * pszCode
        );
        HRESULT GetEventNameW(
            [in]  DVB_STRCONV_MODE  convMode,
            [out] BSTR            * pbstrName
        );
        HRESULT GetTextW(
            [in]  DVB_STRCONV_MODE  convMode,
            [out] BSTR            * pbstrText
        );
    };



    ///////////////////////////////////////////////////////////
    //
    // IDvbExntededEventDescriptor Interface
    //
    ///////////////////////////////////////////////////////////
    [
        AM_LOCAL
        object,
        uuid(C9B22ECA-85F4-499F-B1DB-EFA93A91EE57),
        pointer_default(unique)
    ]
    interface IDvbExtendedEventDescriptor : IUnknown
    {
        HRESULT GetTag(
            [out] BYTE * pbVal
        );
        HRESULT GetLength(
            [out] BYTE * pbVal
        );
        HRESULT GetDescriptorNumber(
            [out] BYTE * pbVal
        );
        HRESULT GetLastDescriptorNumber(
            [out] BYTE * pbVal
        );
        HRESULT GetLanguageCode(
            [out AM_ANNOTATION("__out_ecount(4)")] char * pszCode
        );
        HRESULT GetCountOfRecords(
            [out] BYTE * pbVal
        );
        HRESULT GetRecordItemW(
            [in]  BYTE              bRecordIndex,
            [in]  DVB_STRCONV_MODE  convMode,
            [out] BSTR            * pbstrDesc,
            [out] BSTR            * pbstrItem
        );
        HRESULT GetConcatenatedItemW(
            [in]  IDvbExtendedEventDescriptor * pFollowingDescriptor,
            [in]  DVB_STRCONV_MODE              convMode,
            [out] BSTR *                        pbstrDesc,
            [out] BSTR *                        pbstrItem
        );
        HRESULT GetTextW(
            [in]  DVB_STRCONV_MODE  convMode,
            [out] BSTR            * pbstrText
        );
        HRESULT GetConcatenatedTextW(
            [in]  IDvbExtendedEventDescriptor * FollowingDescriptor,
            [in]  DVB_STRCONV_MODE              convMode,
            [out] BSTR *                        pbstrText
        );
        HRESULT GetRecordItemRawBytes(
            [in]  BYTE    bRecordIndex,
            [out] BYTE ** ppbRawItem,
            [out] BYTE *  pbItemLength
        );
    };



    ///////////////////////////////////////////////////////////
    //
    // IDvbComponentDescriptor Interface
    //
    ///////////////////////////////////////////////////////////
    [
        AM_LOCAL
        object,
        uuid(91E405CF-80E7-457F-9096-1B9D1CE32141),
        pointer_default(unique)
    ]
    interface IDvbComponentDescriptor : IUnknown
    {
        HRESULT GetTag(
            [out] BYTE * pbVal
        );
        HRESULT GetLength(
            [out] BYTE * pbVal
        );
        HRESULT GetStreamContent(
            [out] BYTE * pbVal
        );
        HRESULT GetComponentType(
            [out] BYTE * pbVal
        );
        HRESULT GetComponentTag(
            [out] BYTE * pbVal
        );
        HRESULT GetLanguageCode(
            [out AM_ANNOTATION("__out_ecount(4)")]  char * pszCode
        );
        HRESULT GetTextW(
            [in]  DVB_STRCONV_MODE  convMode,
            [out] BSTR            * pbstrText
        );
    };



    ///////////////////////////////////////////////////////////
    //
    // IDvbContentDescriptor Interface
    //
    ///////////////////////////////////////////////////////////
    [
        AM_LOCAL
        object,
        uuid(2E883881-A467-412A-9D63-6F2B6DA05BF0),
        pointer_default(unique)
    ]
    interface IDvbContentDescriptor : IUnknown
    {
        HRESULT GetTag(
            [out] BYTE * pbVal
        );
        HRESULT GetLength(
            [out] BYTE * pbVal
        );
        HRESULT GetCountOfRecords(
            [out] BYTE * pbVal
        );
        HRESULT GetRecordContentNibbles(
            [in]  BYTE   bRecordIndex,
            [out] BYTE * pbValLevel1,
            [out] BYTE * pbValLevel2
        );
        HRESULT GetRecordUserNibbles(
            [in]  BYTE   bRecordIndex,
            [out] BYTE * pbVal1,
            [out] BYTE * pbVal2            
        );
   };



    ///////////////////////////////////////////////////////////
    //
    // IDvbParentalRatingDescriptor Interface
    //
    ///////////////////////////////////////////////////////////
    [
        AM_LOCAL
        object,
        uuid(3AD9DDE1-FB1B-4186-937F-22E6B5A72A10),
        pointer_default(unique)
    ]
    interface IDvbParentalRatingDescriptor : IUnknown
    {
        HRESULT GetTag(
            [out] BYTE * pbVal
        );
        HRESULT GetLength(
            [out] BYTE * pbVal
        );
        HRESULT GetCountOfRecords(
            [out] BYTE * pbVal
        );
        HRESULT GetRecordRating(
            [in]  BYTE   bRecordIndex,
            [out AM_ANNOTATION("__out_ecount(4)")] char * pszCountryCode,
            [out] BYTE * pbVal
        );
    };



    ///////////////////////////////////////////////////////////
    //
    // IIsdbTerrestrialDeliverySystemDescriptor Interface
    //
    ///////////////////////////////////////////////////////////
    [
        AM_LOCAL
        object,
        uuid(39FAE0A6-D151-44DD-A28A-765DE5991670),
        pointer_default(unique)
    ]
    interface IIsdbTerrestrialDeliverySystemDescriptor : IUnknown
    {
        HRESULT GetTag(
            [out] BYTE * pbVal
        );
        HRESULT GetLength(
            [out] BYTE * pbVal
        );
        HRESULT GetAreaCode(
            [out] WORD * pwVal
        );
        HRESULT GetGuardInterval(
            [out] BYTE * pbVal
        );
        HRESULT GetTransmissionMode(
            [out] BYTE * pbVal
        );
        HRESULT GetCountOfRecords(
            [out] BYTE * pbVal
        );
        HRESULT GetRecordFrequency(
            [in] BYTE     bRecordIndex,
            [out] DWORD * pdwVal
        );
    };



    ///////////////////////////////////////////////////////////
    //
    // IIsdbTSInformationDescriptor Interface
    //
    ///////////////////////////////////////////////////////////
    [
        AM_LOCAL
        object,
        uuid(D7AD183E-38F5-4210-B55F-EC8D601BBD47),
        pointer_default(unique)
    ]
    interface IIsdbTSInformationDescriptor : IUnknown
    {
        HRESULT GetTag(
            [out] BYTE * pbVal
        );
        HRESULT GetLength(
            [out] BYTE * pbVal
        );
        HRESULT GetRemoteControlKeyId(
            [out] BYTE * pbVal
        );
        HRESULT GetTSNameW(
            [in]  DVB_STRCONV_MODE  convMode,
            [out] BSTR            * pbstrName
        );
        HRESULT GetCountOfRecords(
            [out] BYTE * pbVal
        );
        HRESULT GetRecordTransmissionTypeInfo(
            [in] BYTE    bRecordIndex,
            [out] BYTE * pbVal
        );
        HRESULT GetRecordNumberOfServices(
            [in] BYTE    bRecordIndex,
            [out] BYTE * pbVal
        );
        HRESULT GetRecordServiceIdByIndex(
            [in] BYTE    bRecordIndex,
            [in] BYTE    bServiceIndex,
            [out] WORD * pdwVal
        );
    };



    ///////////////////////////////////////////////////////////
    //
    // IIsdbDigitalCopyControlDescriptor Interface
    //
    ///////////////////////////////////////////////////////////
    [
        AM_LOCAL
        object,
        uuid(1A28417E-266A-4BB8-A4BD-D782BCFB8161),
        pointer_default(unique)
    ]
    interface IIsdbDigitalCopyControlDescriptor : IUnknown
    {
        HRESULT GetTag(
            [out] BYTE * pbVal
        );
        HRESULT GetLength(
            [out] BYTE * pbVal
        );
        HRESULT GetCopyControl(
            [out] BYTE * pbDigitalRecordingControlData,
            [out] BYTE * pbCopyControlType,
            [out] BYTE * pbAPSControlData,
            [out] BYTE * pbMaximumBitrate            
        );
        HRESULT GetCountOfRecords(
            [out] BYTE * pbVal
        );
        HRESULT GetRecordCopyControl(
            [in] BYTE    bRecordIndex,
            [out] BYTE * pbComponentTag,
            [out] BYTE * pbDigitalRecordingControlData,
            [out] BYTE * pbCopyControlType,
            [out] BYTE * pbAPSControlData,
            [out] BYTE * pbMaximumBitrate            
       );
    };



    ///////////////////////////////////////////////////////////
    //
    // IIsdbAudioComponentDescriptor Interface
    //
    ///////////////////////////////////////////////////////////
    [
        AM_LOCAL
        object,
        uuid(679D2002-2425-4BE4-A4C7-D6632A574F4D),
        pointer_default(unique)
    ]
    interface IIsdbAudioComponentDescriptor : IUnknown
    {
        HRESULT GetTag(
            [out] BYTE * pbVal
        );
        HRESULT GetLength(
            [out] BYTE * pbVal
        );
        HRESULT GetStreamContent(
            [out] BYTE * pbVal
        );
        HRESULT GetComponentType(
            [out] BYTE * pbVal
        );
        HRESULT GetComponentTag(
            [out] BYTE * pbVal
        );
        HRESULT GetStreamType(
            [out] BYTE * pbVal
        );
        HRESULT GetSimulcastGroupTag(
            [out] BYTE * pbVal
        );
        HRESULT GetESMultiLingualFlag(
            [out] BOOL * pfVal
        );
        HRESULT GetMainComponentFlag(
            [out] BOOL * pfVal
        );
        HRESULT GetQualityIndicator(
            [out] BYTE * pbVal
        );
        HRESULT GetSamplingRate(
            [out] BYTE * pbVal
        );
        HRESULT GetLanguageCode(
            [out AM_ANNOTATION("__out_ecount(4)")] char * pszCode
        );
        HRESULT GetLanguageCode2(
            [out AM_ANNOTATION("__out_ecount(4)")] char * pszCode
        );
        HRESULT GetTextW(
            [in]  DVB_STRCONV_MODE  convMode,
            [out] BSTR            * pbstrText
        );
    };



    ///////////////////////////////////////////////////////////
    //
    // IIsdbDataContentDescriptor Interface
    //
    ///////////////////////////////////////////////////////////
    [
        AM_LOCAL
        object,
        uuid(A428100A-E646-4BD6-AA14-6087BDC08CD5),
        pointer_default(unique)
    ]
    interface IIsdbDataContentDescriptor : IUnknown
    {
        HRESULT GetTag(
            [out] BYTE * pbVal
        );
        HRESULT GetLength(
            [out] BYTE * pbVal
        );
        HRESULT GetDataComponentId(
            [out] WORD * pwVal
        );
        HRESULT GetEntryComponent(
            [out] BYTE * pbVal
        );
        HRESULT GetSelectorLength(
            [out] BYTE * pbVal
        );
        HRESULT GetSelectorBytes(
            [in]  BYTE   bBufLength,
            [out] BYTE * pbBuf
        );
        HRESULT GetCountOfRecords(
            [out] BYTE * pbVal
        );
        HRESULT GetRecordComponentRef(
            [in]  BYTE   bRecordIndex,
            [out] BYTE * pbVal
        );
        HRESULT GetLanguageCode(
            [out AM_ANNOTATION("__out_ecount(4)")] char * pszCode
        );
        HRESULT GetTextW(
            [in]  DVB_STRCONV_MODE  convMode,
            [out] BSTR            * pbstrText
        );
    };
    


    ///////////////////////////////////////////////////////////
    //
    // IIsdbCAContractInformationDescriptor Interface
    //
    ///////////////////////////////////////////////////////////
    [
        AM_LOCAL
        object,
        uuid(08E18B25-A28F-4E92-821E-4FCED5CC2291),
        pointer_default(unique)
    ]
    interface IIsdbCAContractInformationDescriptor : IUnknown
    {
        HRESULT GetTag(
            [out] BYTE * pbVal
        );
        HRESULT GetLength(
            [out] BYTE * pbVal
        );
        HRESULT GetCASystemId(
            [out] WORD * pwVal
        );
        HRESULT GetCAUnitId(
            [out] BYTE * pbVal
        );
        HRESULT GetCountOfRecords(
            [out] BYTE * pbVal
        );
        HRESULT GetRecordComponentTag(
            [in]  BYTE   bRecordIndex,
            [out] BYTE * pbVal
        );
        HRESULT GetContractVerificationInfoLength(
            [out] BYTE * pbVal
        );
        HRESULT GetContractVerificationInfo(
            [in]  BYTE   bBufLength,
            [out] BYTE * pbBuf
        );
        HRESULT GetFeeNameW(
            [in]  DVB_STRCONV_MODE  convMode,
            [out] BSTR            * pbstrName
        );
    };



    ///////////////////////////////////////////////////////////
    //
    // IIsdbEventGroupDescriptor Interface
    //
    ///////////////////////////////////////////////////////////
    [
        AM_LOCAL
        object,
        uuid(94B06780-2E2A-44DC-A966-CC56FDABC6C2),
        pointer_default(unique)
    ]
    interface IIsdbEventGroupDescriptor : IUnknown
    {
        HRESULT GetTag(
            [out] BYTE * pbVal
        );
        HRESULT GetLength(
            [out] BYTE * pbVal
        );
        HRESULT GetGroupType(
            [out] BYTE * pbVal
        );
        HRESULT GetCountOfRecords(
            [out] BYTE * pbVal
        );
        HRESULT GetRecordEvent(
            [in]  BYTE   bRecordIndex,
            [out] WORD * pwServiceId,
            [out] WORD * pwEventId
        );
        HRESULT GetCountOfRefRecords(
            [out] BYTE * pbVal
        );
        HRESULT GetRefRecordEvent(
            [in]  BYTE   bRecordIndex,
            [out] WORD * pwOriginalNetworkId,
            [out] WORD * pwTransportStreamId,
            [out] WORD * pwServiceId,
            [out] WORD * pwEventId
        );
    };



    ///////////////////////////////////////////////////////////
    //
    // IIsdbComponentGroupDescriptor Interface
    //
    ///////////////////////////////////////////////////////////
    [
        AM_LOCAL
        object,
        uuid(A494F17F-C592-47D8-8943-64C9A34BE7B9),
        pointer_default(unique)
    ]
    interface IIsdbComponentGroupDescriptor : IUnknown
    {
        HRESULT GetTag(
            [out] BYTE * pbVal
        );
        HRESULT GetLength(
            [out] BYTE * pbVal
        );
        HRESULT GetComponentGroupType(
            [out] BYTE * pbVal
         );
        HRESULT GetCountOfRecords(
            [out] BYTE * pbVal
        );
        HRESULT GetRecordGroupId(
            [in]  BYTE   bRecordIndex,
            [out] BYTE * pbVal
        );
        HRESULT GetRecordNumberOfCAUnit(
            [in]  BYTE   bRecordIndex,
            [out] BYTE * pbVal
        );
        HRESULT GetRecordCAUnitCAUnitId(
            [in]  BYTE   bRecordIndex,
            [in]  BYTE   bCAUnitIndex,
            [out] BYTE * pbVal
        );
        HRESULT GetRecordCAUnitNumberOfComponents(
            [in]  BYTE   bRecordIndex,
            [in]  BYTE   bCAUnitIndex,
            [out] BYTE * pbVal
        );
        HRESULT GetRecordCAUnitComponentTag(
            [in]  BYTE   bRecordIndex,
            [in]  BYTE   bCAUnitIndex,
            [in]  BYTE   bComponentIndex,
            [out] BYTE * pbVal
        );
        HRESULT GetRecordTotalBitRate(
            [in]  BYTE   bRecordIndex,
            [out] BYTE * pbVal
        );
        HRESULT GetRecordTextW(
            [in]  BYTE              bRecordIndex,
            [in]  DVB_STRCONV_MODE  convMode,
            [out] BSTR            * pbstrText
        );
    };



    ///////////////////////////////////////////////////////////
    //
    // IIsdbSeriesDescriptor Interface
    //
    ///////////////////////////////////////////////////////////
    [
        AM_LOCAL
        object,
        uuid(07EF6370-1660-4F26-87FC-614ADAB24B11),
        pointer_default(unique)
    ]
    interface IIsdbSeriesDescriptor : IUnknown
    {
        HRESULT GetTag(
            [out] BYTE * pbVal
        );
        HRESULT GetLength(
            [out] BYTE * pbVal
        );
        HRESULT GetSeriesId(
            [out] WORD * pwVal
        );
        HRESULT GetRepeatLabel(
            [out] BYTE * pbVal
        );
        HRESULT GetProgramPattern(
            [out] BYTE * pbVal
        );
        HRESULT GetExpireDate(
            [out] BOOL *               pfValid,
            [out] MPEG_DATE_AND_TIME * pmdtVal
        );
        HRESULT GetEpisodeNumber(
            [out] WORD * pwVal
        );
        HRESULT GetLastEpisodeNumber(
            [out] WORD * pwVal
        );
        HRESULT GetSeriesNameW(
            [in]  DVB_STRCONV_MODE  convMode,
            [out] BSTR            * pbstrName
        );
    };
    
    ///////////////////////////////////////////////////////////
    //
    // IIsdbDownloadContentDescriptor Interface
    //
    ///////////////////////////////////////////////////////////
    [
        AM_LOCAL
        object,
        uuid(5298661E-CB88-4F5F-A1DE-5F440C185B92),
        pointer_default(unique)
    ]
    interface IIsdbDownloadContentDescriptor : IUnknown
    {
        HRESULT GetTag(
            [out] BYTE * pbVal
        );
        HRESULT GetLength(
            [out] BYTE * pbVal
        );
        HRESULT GetFlags(
            [out] BOOL * pfReboot,
            [out] BOOL * pfAddOn,
            [out] BOOL * pfCompatibility,
            [out] BOOL * pfModuleInfo,
            [out] BOOL * pfTextInfo
        );
        HRESULT GetComponentSize(
            [out] DWORD * pdwVal
        );
        HRESULT GetDownloadId(
            [out] DWORD * pdwVal
        );
        HRESULT GetTimeOutValueDII(
            [out] DWORD * pdwVal
        );
        HRESULT GetLeakRate(
            [out] DWORD * pdwVal
        );
        HRESULT GetComponentTag(
            [out] BYTE * pbVal
        );
        HRESULT GetCompatiblityDescriptorLength(
            [out] WORD * pwLength
        );
        HRESULT GetCompatiblityDescriptor(
            [out] BYTE ** ppbData
        );
        HRESULT GetCountOfRecords(
            [out] WORD * pwVal
        );
        HRESULT GetRecordModuleId(
            [in]  WORD   wRecordIndex,
            [out] WORD * pwVal
        );
        HRESULT GetRecordModuleSize(
            [in]  WORD    wRecordIndex,
            [out] DWORD * pdwVal
        );
        HRESULT GetRecordModuleInfoLength(
            [in]  WORD   wRecordIndex,
            [out] BYTE * pbVal
        );
        HRESULT GetRecordModuleInfo(
            [in]  WORD    wRecordIndex,
            [out] BYTE ** ppbData
        );
        HRESULT GetTextLanguageCode(
     	    [out AM_ANNOTATION("__out_ecount(4)")]  char * szCode
        );
        HRESULT GetTextW(
            [in]  DVB_STRCONV_MODE  convMode,
            [out] BSTR            * pbstrName
        );
    };

    ///////////////////////////////////////////////////////////
    //
    // IIsdbLogoTransmissionDescriptor Interface
    //
    ///////////////////////////////////////////////////////////
    [
        AM_LOCAL
        object,
        uuid(E0103F49-4AE1-4F07-9098-756DB1FA88CD),
        pointer_default(unique)
    ]
    interface IIsdbLogoTransmissionDescriptor : IUnknown
    {
        HRESULT GetTag(
            [out] BYTE * pbVal
        );
        HRESULT GetLength(
            [out] BYTE * pbVal
        );
        HRESULT GetLogoTransmissionType(
            [out] BYTE * pbVal
        );
        HRESULT GetLogoId(
            [out] WORD * pwVal
        );
        HRESULT GetLogoVersion(
            [out] WORD * pwVal
        );
        HRESULT GetDownloadDataId(
            [out] WORD * pwVal
        );
        HRESULT GetLogoCharW(
            [in]  DVB_STRCONV_MODE  convMode,
            [out] BSTR            * pbstrChar
        );
    };

    ///////////////////////////////////////////////////////////
    //
    // IIsdbSIParameterDescriptor Interface
    //
    ///////////////////////////////////////////////////////////
    [
        AM_LOCAL
        object,
        uuid(F837DC36-867C-426a-9111-F62093951A45),
        pointer_default(unique)
    ]
    interface IIsdbSIParameterDescriptor : IUnknown
    {
        HRESULT GetTag(
            [out] BYTE * pbVal
        );
        HRESULT GetLength(
            [out] BYTE * pbVal
        );
        HRESULT GetParameterVersion(
            [out] BYTE * pbVal
         );
        HRESULT GetUpdateTime(
            [out] MPEG_DATE * pVal
        );
        HRESULT GetRecordNumberOfTable(
            [out] BYTE * pbVal
        );
        HRESULT GetTableId(
            [in]  BYTE   bRecordIndex,
            [out] BYTE * pbVal
        );
        HRESULT GetTableDescriptionLength(
            [in]  BYTE   bRecordIndex,
            [out] BYTE * pbVal
        );
        HRESULT GetTableDescriptionBytes(
            [in]      BYTE   bRecordIndex,
            [in, out] BYTE * pbBufferLength,
            [out]     BYTE * pbBuffer
        );
    };

    ///////////////////////////////////////////////////////////
    //
    // IIsdbEmergencyInformationDescriptor Interface
    //
    ///////////////////////////////////////////////////////////
    [
        AM_LOCAL
        object,
        uuid(BA6FA681-B973-4da1-9207-AC3E7F0341EB),
        pointer_default(unique)
    ]
    interface IIsdbEmergencyInformationDescriptor : IUnknown
    {
        HRESULT GetTag(
            [out] BYTE * pbVal
        );
        HRESULT GetLength(
            [out] BYTE * pbVal
        );
        HRESULT GetCountOfRecords(
            [out] BYTE * pbVal
        );
        HRESULT GetServiceId(
            [in]  BYTE   bRecordIndex,
            [out] WORD * pwVal
        );
        HRESULT GetStartEndFlag(
            [in]  BYTE   bRecordIndex,
            [out] BYTE * pVal
        );
        HRESULT GetSignalLevel(
            [in]  BYTE   bRecordIndex,
            [out] BYTE * pbVal
        );
        HRESULT GetAreaCode(
            [in]  BYTE    bRecordIndex,
            [out] WORD ** ppwVal,           // Upper 12-bits: area_code
            [out] BYTE *  pbNumAreaCodes
        );
    };

    ///////////////////////////////////////////////////////////
    //
    // IIsdbCADescriptor Interface
    //
    ///////////////////////////////////////////////////////////
    [
        AM_LOCAL
        object,
        uuid(0570AA47-52BC-42ae-8CA5-969F41E81AEA),
        pointer_default(unique)
    ]
    interface IIsdbCADescriptor : IUnknown
    {
        HRESULT GetTag(
            [out] BYTE * pbVal
        );
        HRESULT GetLength(
            [out] BYTE * pbVal
        );
        HRESULT GetCASystemId(
            [out] WORD * pwVal
         );
        HRESULT GetReservedBits(
            [out] BYTE * pbVal
        );
        HRESULT GetCAPID(
            [out] WORD * pwVal
        );
        HRESULT GetPrivateDataBytes(
            [in, out] BYTE * pbBufferLength,    // retuen reqired buffer length if pbBuffer is null.
            [out]     BYTE * pbBuffer
        );
    };

    ///////////////////////////////////////////////////////////
    //
    // IIsdbCAServiceDescriptor Interface
    //
    ///////////////////////////////////////////////////////////
    [
        AM_LOCAL
        object,
        uuid(39CBEB97-FF0B-42a7-9AB9-7B9CFE70A77A),
        pointer_default(unique)
    ]
    interface IIsdbCAServiceDescriptor : IUnknown
    {
        HRESULT GetTag(
            [out] BYTE * pbVal
        );
        HRESULT GetLength(
            [out] BYTE * pbVal
        );
        HRESULT GetCASystemId(
            [out] WORD * pwVal
         );
        HRESULT GetCABroadcasterGroupId(
            [out] BYTE * pbVal
        );
        HRESULT GetMessageControl(
            [out] BYTE * pbVal
        );
        HRESULT GetServiceIds(
            [in, out] BYTE * pbNumServiceIds,   // retuen reqired number of IDs if pwServiceIds is null.
            [out]     WORD * pwServiceIds
        );
    };

    ///////////////////////////////////////////////////////////
    //
    // IIsdbHierarchicalTransmissionDescriptor Interface
    //
    ///////////////////////////////////////////////////////////
    [
        AM_LOCAL
        object,
        uuid(B7B3AE90-EE0B-446d-8769-F7E2AA266AA6),
        pointer_default(unique)
    ]
    interface IIsdbHierarchicalTransmissionDescriptor : IUnknown
    {
        HRESULT GetTag(
            [out] BYTE * pbVal
        );
        HRESULT GetLength(
            [out] BYTE * pbVal
        );
        HRESULT GetFutureUse1(
            [out] BYTE * pbVal          // 7-bits
         );
        HRESULT GetQualityLevel(
            [out] BYTE * pbVal          // 1-bits
        );
        HRESULT GetFutureUse2(
            [out] BYTE * pbVal          // 3-bits
        );
        HRESULT GetReferencePid(
            [out] WORD * pwVal          // 13-bits
        );
    };

    ///////////////////////////////////////////////////////////
    //
    // stream_identifier_descriptor
    //  It has only one byte body (component_tag).
    //  We will not define particular interface. 
    //
    ///////////////////////////////////////////////////////////
cpp_quote("#define COMPONENT_TAG_CAPTION_MIN            0x30")
cpp_quote("#define COMPONENT_TAG_CAPTION_MAX            0x37")
cpp_quote("#define COMPONENT_TAG_SUPERIMPOSE_MIN        0x38")
cpp_quote("#define COMPONENT_TAG_SUPERIMPOSE_MAX        0x3F")

interface IPBDA_EIT;
interface IPBDA_Services;
    ////////////////////////////////////
    //
    // IPBDASiParser Interface
    //
    ////////////////////////////////////

    [
        AM_LOCAL
        object,
        uuid(9DE49A74-ABA2-4a18-93E1-21F17F95C3C3),
        pointer_default(unique)
    ]
    interface IPBDASiParser : IUnknown
    {
        HRESULT Initialize([in] IUnknown * punk
        );
        

        HRESULT GetEIT([in] DWORD dwSize ,
                      [in]  BYTE *pBuffer,       
                      [out] IPBDA_EIT ** ppEIT
        );

        HRESULT GetServices ([in] DWORD dwSize ,
                      [in]  const BYTE *pBuffer,       
                      [out] IPBDA_Services ** ppServices
        );
    };

    ////////////////////////////////////
    //
    // IPBDA_EIT Interface
    //
    ////////////////////////////////////

    [
        object,
        local,
        uuid(A35F2DEA-098F-4ebd-984C-2BD4C3C8CE0A),
        helpstring("IPBDA_EIT Interface"),
        pointer_default(unique)
    ]
    interface IPBDA_EIT : IUnknown
    {
        HRESULT Initialize(
            [in] DWORD size, 
            [in] [size_is(size)] const BYTE *pBuffer 
        );

    /* Table level data */
        HRESULT GetTableId(
            [out] BYTE * pbVal
        );

        HRESULT GetVersionNumber(
            [out] WORD * pwVal
        );

        HRESULT GetServiceIdx (
            [out] ULONG64 * plwVal
        );


    /* Descriptors follow here */
        
        HRESULT GetCountOfRecords(
            [out] DWORD * pdwVal
        );

        HRESULT GetRecordEventId(
            [in]  DWORD dwRecordIndex,
            [out] ULONG64 * plwVal
        );

        HRESULT GetRecordStartTime(
            [in]  DWORD dwRecordIndex,
            [out] MPEG_DATE_AND_TIME * pmdtVal
        );

        HRESULT GetRecordDuration(
            [in]  DWORD dwRecordIndex,
            [out] MPEG_DURATION * pmdVal
        );

    /* Descriptors follow here */
        
        HRESULT GetRecordCountOfDescriptors(
            [in]  DWORD   dwRecordIndex,
            [out] DWORD * pdwVal
        );

        HRESULT GetRecordDescriptorByIndex(
            [in]  DWORD                 dwRecordIndex,
            [in]  DWORD                 dwIndex,
            [out] IGenericDescriptor ** ppDescriptor
        );

        HRESULT GetRecordDescriptorByTag(
            [in]  DWORD                 dwRecordIndex,
            [in]  BYTE                  bTag,
            [in, out]  DWORD *          pdwCookie, // OPTIONAL
            [out] IGenericDescriptor ** ppDescriptor
        );

    };

    ////////////////////////////////////
    //
    // IPBDA_Services Interface
    //
    ////////////////////////////////////

    [
        object,
        local,
        uuid(944EAB37-EED4-4850-AFD2-77E7EFEB4427),
        helpstring("IPBDA_Services Interface"),
        pointer_default(unique)
    ]
    interface IPBDA_Services : IUnknown
    {
        HRESULT Initialize(
            [in] DWORD size, 
            [in] [size_is(size)] BYTE *pBuffer 
        );
        
        HRESULT GetCountOfRecords(
            [out] DWORD * pdwVal
        );

        HRESULT GetRecordByIndex ( 
            [in]  DWORD dwRecordIndex,
            [out] ULONG64 *pul64ServiceIdx 
        );
    };

    ///////////////////////////////////////////////////////////
    //
    // IPBDAEntitlementDescriptor Interface
    //
    ///////////////////////////////////////////////////////////
    [
        AM_LOCAL
        object,
        uuid(22632497-0DE3-4587-AADC-D8D99017E760),
        pointer_default(unique)
    ]
    interface IPBDAEntitlementDescriptor : IUnknown
    {
        HRESULT GetTag(
            [out] BYTE * pbVal 
        );

        HRESULT GetLength(
            [out] WORD * pwVal 
        );

        HRESULT GetToken (
            [out] BYTE ** ppbTokenBuffer,
            [out] DWORD *  pdwTokenLength 
        );

    };

    ///////////////////////////////////////////////////////////
    //
    // IPBDAAttributesDescriptor Interface
    //
    ///////////////////////////////////////////////////////////
    [
        AM_LOCAL
        object,
        uuid(313B3620-3263-45a6-9533-968BEFBEAC03),
        pointer_default(unique)
    ]
    interface IPBDAAttributesDescriptor : IUnknown
    {
        HRESULT GetTag(
            [out] BYTE * pbVal
        );
        HRESULT GetLength(
            [out] WORD * pwVal
        );
        HRESULT GetAttributePayload (
            [out] BYTE ** ppbAttributeBuffer,
            [out] DWORD *  pdwAttributeLength
        );

    };
    

