| /* | 
 |  * Copyright (C) 2025 Biswapriyo Nath | 
 |  * | 
 |  * This library is free software; you can redistribute it and/or | 
 |  * modify it under the terms of the GNU Lesser General Public | 
 |  * License as published by the Free Software Foundation; either | 
 |  * version 2.1 of the License, or (at your option) any later version. | 
 |  * | 
 |  * This library is distributed in the hope that it will be useful, | 
 |  * but WITHOUT ANY WARRANTY; without even the implied warranty of | 
 |  * MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE.  See the GNU | 
 |  * Lesser General Public License for more details. | 
 |  * | 
 |  * You should have received a copy of the GNU Lesser General Public | 
 |  * License along with this library; if not, write to the Free Software | 
 |  * Foundation, Inc., 51 Franklin St, Fifth Floor, Boston, MA 02110-1301, USA | 
 |  */ | 
 |  | 
 | import "wtypes.idl"; | 
 | #include "mpeg2bits.h" | 
 |  | 
 | typedef WORD PID; | 
 | typedef BYTE TID; | 
 | typedef WORD TEID; | 
 | typedef UINT ClientKey; | 
 |  | 
 | typedef enum | 
 | { | 
 |     MPEG_SECTION_IS_NEXT = 0, | 
 |     MPEG_SECTION_IS_CURRENT = 1, | 
 | } MPEG_CURRENT_NEXT_BIT; | 
 |  | 
 | typedef struct | 
 | { | 
 |     WORD wTidExt; | 
 |     WORD wCount; | 
 | } TID_EXTENSION, *PTID_EXTENSION; | 
 |  | 
 | typedef struct | 
 | { | 
 |     TID TableId; | 
 |     union | 
 |     { | 
 |         MPEG_HEADER_BITS_MIDL S; | 
 |         WORD W; | 
 |     } Header; | 
 |     BYTE SectionData[1]; | 
 | } SECTION, *PSECTION; | 
 |  | 
 | typedef struct | 
 | { | 
 |     TID TableId; | 
 |     union | 
 |     { | 
 |         MPEG_HEADER_BITS_MIDL S; | 
 |         WORD W; | 
 |     } Header; | 
 |     TEID TableIdExtension; | 
 |     union | 
 |     { | 
 |         MPEG_HEADER_VERSION_BITS_MIDL S; | 
 |         BYTE B; | 
 |     } Version; | 
 |     BYTE SectionNumber; | 
 |     BYTE LastSectionNumber; | 
 |     BYTE RemainingData[1]; | 
 | } LONG_SECTION, *PLONG_SECTION; | 
 |  | 
 | typedef struct | 
 | { | 
 |     TID TableId; | 
 |     union | 
 |     { | 
 |         MPEG_HEADER_BITS_MIDL S; | 
 |         WORD W; | 
 |     } Header; | 
 |     TEID TableIdExtension; | 
 |     union | 
 |     { | 
 |         MPEG_HEADER_VERSION_BITS_MIDL S; | 
 |         BYTE B; | 
 |     } Version; | 
 |     BYTE SectionNumber; | 
 |     BYTE LastSectionNumber; | 
 |     BYTE ProtocolDiscriminator; | 
 |     BYTE DsmccType; | 
 |     WORD MessageId; | 
 |     DWORD TransactionId; | 
 |     BYTE Reserved; | 
 |     BYTE AdaptationLength; | 
 |     WORD MessageLength; | 
 |     BYTE RemainingData[1]; | 
 | } DSMCC_SECTION, *PDSMCC_SECTION; | 
 |  | 
 | typedef struct | 
 | { | 
 |     DWORD dwLength; | 
 |     PSECTION pSection; | 
 | } MPEG_RQST_PACKET, *PMPEG_RQST_PACKET; | 
 |  | 
 | typedef struct | 
 | { | 
 |     WORD wPacketCount; | 
 |     [size_is(wPacketCount)] PMPEG_RQST_PACKET PacketList[]; | 
 | } MPEG_PACKET_LIST, *PMPEG_PACKET_LIST; | 
 |  | 
 | typedef struct | 
 | { | 
 |     BOOL fSpecifyProtocol; | 
 |     BYTE Protocol; | 
 |     BOOL fSpecifyType; | 
 |     BYTE Type; | 
 |     BOOL fSpecifyMessageId; | 
 |     WORD MessageId; | 
 |     BOOL fSpecifyTransactionId; | 
 |     BOOL fUseTrxIdMessageIdMask; | 
 |     DWORD TransactionId; | 
 |     BOOL fSpecifyModuleVersion; | 
 |     BYTE ModuleVersion; | 
 |     BOOL fSpecifyBlockNumber; | 
 |     WORD BlockNumber; | 
 |     BOOL fGetModuleCall; | 
 |     WORD NumberOfBlocksInModule; | 
 | } DSMCC_FILTER_OPTIONS; | 
 |  | 
 | typedef struct | 
 | { | 
 |     BOOL fSpecifyEtmId; | 
 |     DWORD EtmId; | 
 | } ATSC_FILTER_OPTIONS; | 
 |  | 
 | typedef struct | 
 | { | 
 |     BOOL fSpecifySegment; | 
 |     BYTE bSegment; | 
 | } DVB_EIT_FILTER_OPTIONS; | 
 |  | 
 | typedef struct | 
 | { | 
 |     BYTE bVersionNumber; | 
 |     WORD wFilterSize; | 
 |     BOOL fUseRawFilteringBits; | 
 |     BYTE Filter[16]; | 
 |     BYTE Mask[16]; | 
 |     BOOL fSpecifyTableIdExtension; | 
 |     WORD TableIdExtension; | 
 |     BOOL fSpecifyVersion; | 
 |     BYTE Version; | 
 |     BOOL fSpecifySectionNumber; | 
 |     BYTE SectionNumber; | 
 |     BOOL fSpecifyCurrentNext; | 
 |     BOOL fNext; | 
 |     BOOL fSpecifyDsmccOptions; | 
 |     DSMCC_FILTER_OPTIONS Dsmcc; | 
 |     BOOL fSpecifyAtscOptions; | 
 |     ATSC_FILTER_OPTIONS Atsc; | 
 | } MPEG2_FILTER, *PMPEG2_FILTER; | 
 |  | 
 | typedef struct | 
 | { | 
 |     union | 
 |     { | 
 |         struct | 
 |         { | 
 |             BYTE bVersionNumber; | 
 |             WORD wFilterSize; | 
 |             BOOL fUseRawFilteringBits; | 
 |             BYTE Filter[16]; | 
 |             BYTE Mask[16]; | 
 |             BOOL fSpecifyTableIdExtension; | 
 |             WORD TableIdExtension; | 
 |             BOOL fSpecifyVersion; | 
 |             BYTE Version; | 
 |             BOOL fSpecifySectionNumber; | 
 |             BYTE SectionNumber; | 
 |             BOOL fSpecifyCurrentNext; | 
 |             BOOL fNext; | 
 |             BOOL fSpecifyDsmccOptions; | 
 |             DSMCC_FILTER_OPTIONS Dsmcc; | 
 |             BOOL fSpecifyAtscOptions; | 
 |             ATSC_FILTER_OPTIONS Atsc; | 
 |         }; | 
 |         BYTE bVersion1Bytes[124]; | 
 |     }; | 
 |     BOOL fSpecifyDvbEitOptions; | 
 |     DVB_EIT_FILTER_OPTIONS DvbEit; | 
 | } MPEG2_FILTER2, *PMPEG2_FILTER2; | 
 |  | 
 | cpp_quote("#define MPEG2_FILTER_VERSION_1_SIZE 124") | 
 | cpp_quote("#define MPEG2_FILTER_VERSION_2_SIZE 133") | 
 |  | 
 | typedef struct | 
 | { | 
 |     HRESULT hr; | 
 |     DWORD dwDataBufferSize; | 
 |     DWORD dwSizeOfDataRead; | 
 |     [size_is(dwDataBufferSize)] BYTE *pDataBuffer; | 
 | } MPEG_STREAM_BUFFER, *PMPEG_STREAM_BUFFER; | 
 |  | 
 | typedef struct | 
 | { | 
 |     BYTE Hours; | 
 |     BYTE Minutes; | 
 |     BYTE Seconds; | 
 | } MPEG_TIME; | 
 |  | 
 | typedef MPEG_TIME MPEG_DURATION; | 
 |  | 
 | typedef struct | 
 | { | 
 |     BYTE Date; | 
 |     BYTE Month; | 
 |     WORD Year; | 
 | } MPEG_DATE; | 
 |  | 
 | typedef struct | 
 | { | 
 |     MPEG_DATE D; | 
 |     MPEG_TIME T; | 
 | } MPEG_DATE_AND_TIME; | 
 |  | 
 | typedef enum | 
 | { | 
 |     MPEG_CONTEXT_BCS_DEMUX, | 
 |     MPEG_CONTEXT_WINSOCK, | 
 | } MPEG_CONTEXT_TYPE; | 
 |  | 
 | typedef struct | 
 | { | 
 |     DWORD AVMGraphId; | 
 | } MPEG_BCS_DEMUX; | 
 |  | 
 | typedef struct | 
 | { | 
 |     DWORD AVMGraphId; | 
 | } MPEG_WINSOCK; | 
 |  | 
 | typedef struct | 
 | { | 
 |     MPEG_CONTEXT_TYPE Type; | 
 |     union | 
 |     { | 
 |         MPEG_BCS_DEMUX Demux; | 
 |         MPEG_WINSOCK Winsock; | 
 |     } U; | 
 | } MPEG_CONTEXT, *PMPEG_CONTEXT; | 
 |  | 
 | typedef enum | 
 | { | 
 |     MPEG_RQST_UNKNOWN = 0, | 
 |     MPEG_RQST_GET_SECTION, | 
 |     MPEG_RQST_GET_SECTION_ASYNC, | 
 |     MPEG_RQST_GET_TABLE, | 
 |     MPEG_RQST_GET_TABLE_ASYNC, | 
 |     MPEG_RQST_GET_SECTIONS_STREAM, | 
 |     MPEG_RQST_GET_PES_STREAM, | 
 |     MPEG_RQST_GET_TS_STREAM, | 
 |     MPEG_RQST_START_MPE_STREAM, | 
 | } MPEG_REQUEST_TYPE; | 
 |  | 
 | typedef struct | 
 | { | 
 |     MPEG_REQUEST_TYPE Type; | 
 |     MPEG_CONTEXT Context; | 
 |     PID Pid; | 
 |     TID TableId; | 
 |     MPEG2_FILTER Filter; | 
 |     DWORD Flags; | 
 | } MPEG_SERVICE_REQUEST, *PMPEG_SERVICE_REQUEST; | 
 |  | 
 | typedef struct | 
 | { | 
 |     DWORD IPAddress; | 
 |     WORD Port; | 
 | } MPEG_SERVICE_RESPONSE, *PMPEG_SERVICE_RESPONSE; | 
 |  | 
 | typedef struct _DSMCC_ELEMENT | 
 | { | 
 |     PID pid; | 
 |     BYTE bComponentTag; | 
 |     DWORD dwCarouselId; | 
 |     DWORD dwTransactionId; | 
 |     struct _DSMCC_ELEMENT *pNext; | 
 | } DSMCC_ELEMENT, *PDSMCC_ELEMENT; | 
 |  | 
 | typedef struct _MPE_ELEMENT | 
 | { | 
 |     PID pid; | 
 |     BYTE bComponentTag; | 
 |     struct _MPE_ELEMENT *pNext; | 
 | } MPE_ELEMENT, *PMPE_ELEMENT; | 
 |  | 
 | typedef struct _MPEG_STREAM_FILTER | 
 | { | 
 |     WORD wPidValue; | 
 |     DWORD dwFilterSize; | 
 |     BOOL fCrcEnabled; | 
 |     BYTE rgchFilter[16]; | 
 |     BYTE rgchMask[16]; | 
 | } MPEG_STREAM_FILTER; |