|
|
//==========================================================================;
//
// THIS CODE AND INFORMATION IS PROVIDED "AS IS" WITHOUT WARRANTY OF ANY
// KIND, EITHER EXPRESSED OR IMPLIED, INCLUDING BUT NOT LIMITED TO THE
// IMPLIED WARRANTIES OF MERCHANTABILITY AND/OR FITNESS FOR A PARTICULAR
// PURPOSE.
//
// Copyright (c) 1992 - 1999 Microsoft Corporation. All Rights Reserved.
//
//==========================================================================;
#ifndef __CODSTRM_H__
#define __CODSTRM_H__
#ifdef __cplusplus
extern "C" { #endif // __cplusplus
#include "defaults.h"
// ------------------------------------------------------------------------
// Property set for all video capture streams
// ------------------------------------------------------------------------
DEFINE_KSPROPERTY_TABLE(VideoStreamConnectionProperties) { DEFINE_KSPROPERTY_ITEM ( KSPROPERTY_CONNECTION_ALLOCATORFRAMING, TRUE, // GetSupported or Handler
sizeof(KSPROPERTY), // MinProperty
sizeof(KSALLOCATOR_FRAMING), // MinData
FALSE, // SetSupported or Handler
NULL, // Values
0, // RelationsCount
NULL, // Relations
NULL, // SupportHandler
sizeof(ULONG) // SerializedSize
) };
DEFINE_KSPROPERTY_TABLE(StreamAllocatorProperties) { DEFINE_KSPROPERTY_ITEM_STREAM_ALLOCATOR ( FALSE, TRUE ) };
// ------------------------------------------------------------------------
// Per pin property set for VBI codec filtering
// ------------------------------------------------------------------------
DEFINE_KSPROPERTY_TABLE(VBICodecProperties) { DEFINE_KSPROPERTY_ITEM ( KSPROPERTY_VBICODECFILTERING_SCANLINES_REQUESTED_BIT_ARRAY, TRUE, // GetSupported or Handler
sizeof(KSPROPERTY), // MinProperty
sizeof(VBICODECFILTERING_SCANLINES), // MinData
TRUE, // SetSupported or Handler
NULL, // Values
0, // RelationsCount
NULL, // Relations
NULL, // SupportHandler
0, // SerializedSize
), DEFINE_KSPROPERTY_ITEM ( KSPROPERTY_VBICODECFILTERING_SCANLINES_DISCOVERED_BIT_ARRAY, TRUE, // GetSupported or Handler
sizeof(KSPROPERTY), // MinProperty
sizeof(VBICODECFILTERING_SCANLINES), // MinData
FALSE, // SetSupported or Handler
NULL, // Values
0, // RelationsCount
NULL, // Relations
NULL, // SupportHandler
0, // SerializedSize
), DEFINE_KSPROPERTY_ITEM ( KSPROPERTY_VBICODECFILTERING_SUBSTREAMS_REQUESTED_BIT_ARRAY, TRUE, // GetSupported or Handler
sizeof(KSPROPERTY), // MinProperty
sizeof(VBICODECFILTERING_CC_SUBSTREAMS),// MinData
TRUE, // SetSupported or Handler
NULL, // Values
0, // RelationsCount
NULL, // Relations
NULL, // SupportHandler
0, // SerializedSize
), DEFINE_KSPROPERTY_ITEM ( KSPROPERTY_VBICODECFILTERING_SUBSTREAMS_DISCOVERED_BIT_ARRAY, TRUE, // GetSupported or Handler
sizeof(KSPROPERTY), // MinProperty
sizeof(VBICODECFILTERING_CC_SUBSTREAMS),// MinData
FALSE, // SetSupported or Handler
NULL, // Values
0, // RelationsCount
NULL, // Relations
NULL, // SupportHandler
0, // SerializedSize
), DEFINE_KSPROPERTY_ITEM ( KSPROPERTY_VBICODECFILTERING_STATISTICS, TRUE, // GetSupported or Handler
sizeof(KSPROPERTY), // MinProperty
sizeof(VBICODECFILTERING_STATISTICS_CC_PIN),// MinData
TRUE, // SetSupported or Handler
NULL, // Values
0, // RelationsCount
NULL, // Relations
NULL, // SupportHandler
0, // SerializedSize
), };
// ------------------------------------------------------------------------
// Array of all of the property sets supported by video streams
// ------------------------------------------------------------------------
DEFINE_KSPROPERTY_SET_TABLE(VideoStreamProperties) { DEFINE_KSPROPERTY_SET ( &KSPROPSETID_Connection, // Set
SIZEOF_ARRAY(VideoStreamConnectionProperties), // PropertiesCount
VideoStreamConnectionProperties, // PropertyItems
0, // FastIoCount
NULL // FastIoTable
), DEFINE_KSPROPERTY_SET ( &KSPROPSETID_Stream, // Set
SIZEOF_ARRAY(StreamAllocatorProperties), // PropertiesCount
StreamAllocatorProperties, // PropertyItems
0, // FastIoCount
NULL // FastIoTable
), DEFINE_KSPROPERTY_SET ( &KSPROPSETID_VBICodecFiltering, // Set
SIZEOF_ARRAY(VBICodecProperties), // PropertiesCount
VBICodecProperties, // PropertyItems
0, // FastIoCount
NULL // FastIoTable
) };
#define NUMBER_VIDEO_STREAM_PROPERTIES (SIZEOF_ARRAY(VideoStreamProperties))
//---------------------------------------------------------------------------
// All of the video and vbi data formats we might use
//---------------------------------------------------------------------------
KSDATARANGE StreamFormatCC = { // Definition of the CC stream
{ sizeof (KSDATARANGE), // FormatSize
0, // Flags
CCSamples, // SampleSize
0, // Reserved
{ STATIC_KSDATAFORMAT_TYPE_AUXLine21Data }, { STATIC_KSDATAFORMAT_SUBTYPE_Line21_BytePair }, { STATIC_KSDATAFORMAT_SPECIFIER_NONE } } };
#ifdef CCINPUTPIN
# define GUIDKLUDGESTORAGE
# include "guidkludge.h"
KSDATARANGE StreamFormatCCin = { // Definition of the CC input stream
{ sizeof (KSDATARANGE), // FormatSize
0, // Flags
sizeof (CC_HW_FIELD), // SampleSize
0, // Reserved
{ STATIC_KSDATAFORMAT_TYPE_VBI }, { STATIC_KSDATAFORMAT_SUBTYPE_CC }, { STATIC_KSDATAFORMAT_SPECIFIER_NONE } } }; #endif // CCINPUTPIN
// Warning, the following VBI geometry is governed by the capture driver NOT
// the codecs. Therefore, any specification of a VBI capture format will be
// ignored by most capture drivers. Look at the KS_VBI_FRAME_INFO data on each
// sample to determine the actual data characteristics of the samples.
#define NORMAL_VBI_START_LINE 10
#define NORMAL_VBI_STOP_LINE 21
#define MIN_VBI_X_SAMPLES (720*2)
#define AVG_VBI_X_SAMPLES (VBISamples)
#define MAX_VBI_X_SAMPLES (1135*2)
#define MIN_VBI_Y_SAMPLES (1)
#define AVG_VBI_Y_SAMPLES (12)
#define MAX_VBI_Y_SAMPLES (21)
#define MIN_VBI_T_SAMPLES (50)
#define AVG_VBI_T_SAMPLES (59.94)
#define MAX_VBI_T_SAMPLES (60)
#define NTSC_FSC_FREQUENCY 3580000
#define PAL_FSC_FREQUENCY 4430000
#define MIN_SAMPLING_RATE (min(8*NTSC_FSC_FREQUENCY,8*PAL_FSC_FREQUENCY))
#define AVG_SAMPLING_RATE (8*NTSC_FSC_FREQUENCY)
#define MAX_SAMPLING_RATE (max(8*NTSC_FSC_FREQUENCY,8*PAL_FSC_FREQUENCY))
// This format is the "arbitrary one" that was used in early sample capture drivers!
//---------------------------------------------------------------------------
// All of the video and vbi data formats we might use
//---------------------------------------------------------------------------
KS_DATARANGE_VIDEO_VBI StreamFormatVBI = { // KSDATARANGE
{ { sizeof( KS_DATARANGE_VIDEO_VBI ), 0, VBISamples * VBILines, // SampleSize
0, // Reserved
{ STATIC_KSDATAFORMAT_TYPE_VBI }, { STATIC_KSDATAFORMAT_SUBTYPE_RAW8 }, { STATIC_KSDATAFORMAT_SPECIFIER_VBI } } }, TRUE, // BOOL, bFixedSizeSamples (all samples same size?)
TRUE, // BOOL, bTemporalCompression (all I frames?)
KS_VIDEOSTREAM_VBI, // StreamDescriptionFlags (KS_VIDEO_DESC_*)
0, // MemoryAllocationFlags (KS_VIDEO_ALLOC_*)
// _KS_VIDEO_STREAM_CONFIG_CAPS
{ { STATIC_KSDATAFORMAT_SPECIFIER_VBI }, KS_AnalogVideo_NTSC_M, // AnalogVideoStandard
{ VBISamples, VBILines // SIZE InputSize
}, { VBISamples, VBILines // SIZE MinCroppingSize; smallest rcSrc cropping rect allowed
}, { VBISamples, VBILines // SIZE MaxCroppingSize; largest rcSrc cropping rect allowed
}, 1, // int CropGranularityX; // granularity of cropping size
1, // int CropGranularityY;
1, // int CropAlignX; // alignment of cropping rect
1, // int CropAlignY;
{ VBISamples, VBILines // SIZE MinOutputSize; // smallest bitmap stream can produce
}, { VBISamples, VBILines // SIZE MaxOutputSize; // largest bitmap stream can produce
}, 1, // int OutputGranularityX; // granularity of output bitmap size
2, // int OutputGranularityY;
0, // StretchTapsX (0 no stretch, 1 pix dup, 2 interp...)
0, // StretchTapsY
0, // ShrinkTapsX
0, // ShrinkTapsY
166834, // LONGLONG MinFrameInterval; // 100 nS units
166834, // LONGLONG MaxFrameInterval;
// cool. Bits or Bytes? See other streams as well
VBISamples * 30 * VBILines * 2, // LONG MinBitsPerSecond;
VBISamples * 30 * VBILines * 2 // LONG MaxBitsPerSecond;
},
// KS_VBIINFOHEADER (default format)
{ VBIStart, // StartLine -- inclusive
VBIEnd, // EndLine -- inclusive
SamplingFrequency, // SamplingFrequency
454, // MinLineStartTime; // (uS past HR LE) * 100
454, // MaxLineStartTime; // (uS past HR LE) * 100
454, // ActualLineStartTime // (uS past HR LE) * 100
5902, // ActualLineEndTime; // (uS past HR LE) * 100
KS_AnalogVideo_NTSC_M, // VideoStandard;
VBISamples, // SamplesPerLine;
VBISamples, // StrideInBytes;
VBISamples * VBILines // BufferSize;
} };
//---------------------------------------------------------------------------
// STREAM_Capture Formats
//---------------------------------------------------------------------------
static PKSDATAFORMAT VBIFormats[] = { (PKSDATAFORMAT) &StreamFormatVBI,
// Add more formats here for to mirror output formats for "passthrough" mode
// The idea is that upstream capture drivers may have done some decoding
// already or downstream drivers may wish to have the raw data without any
// decoding at all.
// In that case all we need to do is copy the data (if there is a pending
// SRB) OR forward the SRB to the downstream client.
}; #define NUM_VBI_FORMATS (SIZEOF_ARRAY(VBIFormats))
#ifdef CCINPUTPIN
static PKSDATAFORMAT CCInputFormats[] = { (PKSDATAFORMAT) &StreamFormatCCin }; # define NUM_CC_INPUT_FORMATS (SIZEOF_ARRAY(CCInputFormats))
#endif // CCINPUTPIN
static PKSDATAFORMAT DecodeFormats[] = { (PKSDATAFORMAT) &StreamFormatCC, //(PKSDATAFORMAT) &StreamFormatVBI // Can't do VBI here since Stream1
// does NOT use extended headers
// Add more formats here for whatever CODEC output formats are supported.
}; #define NUM_DECODE_FORMATS (SIZEOF_ARRAY (DecodeFormats))
//---------------------------------------------------------------------------
//---------------------------------------------------------------------------
// Create an array that holds the list of all of the streams supported
//---------------------------------------------------------------------------
static ALL_STREAM_INFO Streams [] = { // -----------------------------------------------------------------
// STREAM_VBI
// -----------------------------------------------------------------
{ // HW_STREAM_INFORMATION -------------------------------------------
{ 1, // NumberOfPossibleInstances
KSPIN_DATAFLOW_IN, // DataFlow
TRUE, // DataAccessible
NUM_VBI_FORMATS, // NumberOfFormatArrayEntries
VBIFormats, // StreamFormatsArray
0, // ClassReserved[0]
0, // ClassReserved[1]
0, // ClassReserved[2]
0, // ClassReserved[3]
NUMBER_VIDEO_STREAM_PROPERTIES, // NumStreamPropArrayEntries
(PKSPROPERTY_SET)VideoStreamProperties, // StreamPropertiesArray
0, // NumStreamEventArrayEntries
0, // StreamEventsArray
(GUID *)&PINNAME_VIDEO_VBI, // Category
(GUID *)&PINNAME_VIDEO_VBI, // Name
0, // MediumsCount
NULL, // Mediums
FALSE, }, // HW_STREAM_OBJECT ------------------------------------------------
{ sizeof (HW_STREAM_OBJECT), // SizeOfThisPacket
STREAM_VBI, // StreamNumber
(PVOID)NULL, // HwStreamExtension
VBIReceiveDataPacket, // HwReceiveDataPacket
VBIReceiveCtrlPacket, // HwReceiveControlPacket
{ // HW_CLOCK_OBJECT
NULL, // .HWClockFunction
0, // .ClockSupportFlags
}, FALSE, // Dma
TRUE, // Pio
(PVOID)NULL, // HwDeviceExtension
sizeof (KS_VBI_FRAME_INFO), // StreamHeaderMediaSpecific
0, // StreamHeaderWorkspace
TRUE, // Allocator
NULL, // HwEventRoutine
}, },
// -----------------------------------------------------------------
// STREAM_Decode (Closed Caption Output )
// -----------------------------------------------------------------
{ // HW_STREAM_INFORMATION -------------------------------------------
{ MAX_PIN_INSTANCES, // NumberOfPossibleInstances
KSPIN_DATAFLOW_OUT, // DataFlow
TRUE, // DataAccessible
NUM_DECODE_FORMATS, // NumberOfFormatArrayEntries
DecodeFormats, // StreamFormatsArray
0, // ClassReserved[0]
0, // ClassReserved[1]
0, // ClassReserved[2]
0, // ClassReserved[3]
NUMBER_VIDEO_STREAM_PROPERTIES, // NumStreamPropArrayEntries
(PKSPROPERTY_SET)VideoStreamProperties, // StreamPropertiesArray
0, // NumStreamEventArrayEntries;
0, // StreamEventsArray;
(GUID *)&PINNAME_VIDEO_CC, // Category
(GUID *)&PINNAME_VIDEO_CC, // Name
0, // MediumsCount
NULL, // Mediums
FALSE, }, // HW_STREAM_OBJECT ------------------------------------------------
{ sizeof (HW_STREAM_OBJECT), // SizeOfThisPacket
STREAM_CC, // StreamNumber
(PVOID)NULL, // HwStreamExtension
VBIReceiveDataPacket, // HwReceiveDataPacket
VBIReceiveCtrlPacket, // HwReceiveControlPacket
{ // HW_CLOCK_OBJECT
NULL, // .HWClockFunction
0, // .ClockSupportFlags
}, FALSE, // Dma
TRUE, // Pio
(PVOID)NULL, // HwDeviceExtension
0, // StreamHeaderMediaSpecific
0, // StreamHeaderWorkspace
TRUE, // Allocator
NULL, // HwEventRoutine
}, },
#ifdef CCINPUTPIN
// -----------------------------------------------------------------
// STREAM_CCInput (Closed Caption Input )
// -----------------------------------------------------------------
{ // HW_STREAM_INFORMATION -------------------------------------------
{ 1, // NumberOfPossibleInstances
KSPIN_DATAFLOW_IN, // DataFlow
TRUE, // DataAccessible
NUM_CC_INPUT_FORMATS, // NumberOfFormatArrayEntries
CCInputFormats, // StreamFormatsArray
0, // ClassReserved[0]
0, // ClassReserved[1]
0, // ClassReserved[2]
0, // ClassReserved[3]
NUMBER_VIDEO_STREAM_PROPERTIES, // NumStreamPropArrayEntries
(PKSPROPERTY_SET)VideoStreamProperties, // StreamPropertiesArray
0, // NumStreamEventArrayEntries;
0, // StreamEventsArray;
(GUID *)&PINNAME_VIDEO_CC_CAPTURE, // Category
(GUID *)&PINNAME_VIDEO_CC_CAPTURE, // Name
0, // MediumsCount
NULL, // Mediums
FALSE, }, // HW_STREAM_OBJECT ------------------------------------------------
{ sizeof (HW_STREAM_OBJECT), // SizeOfThisPacket
STREAM_CCINPUT, // StreamNumber
(PVOID)NULL, // HwStreamExtension
VBIReceiveDataPacket, // HwReceiveDataPacket
VBIReceiveCtrlPacket, // HwReceiveControlPacket
{ // HW_CLOCK_OBJECT
NULL, // .HWClockFunction
0, // .ClockSupportFlags
}, FALSE, // Dma
TRUE, // Pio
(PVOID)NULL, // HwDeviceExtension
0, // StreamHeaderMediaSpecific
0, // StreamHeaderWorkspace
TRUE, // Allocator
NULL, // HwEventRoutine
} }, #endif // CCINPUTPIN
};
#define DRIVER_STREAM_COUNT (SIZEOF_ARRAY (Streams))
//---------------------------------------------------------------------------
// Topology
//---------------------------------------------------------------------------
// Categories define what the device does.
static GUID Categories[] = { // {07DAD660-22F1-11d1-A9F4-00C04FBBDE8F}
STATIC_KSCATEGORY_VBICODEC };
#define NUMBER_OF_CATEGORIES SIZEOF_ARRAY (Categories)
static KSTOPOLOGY Topology = { NUMBER_OF_CATEGORIES, (GUID*) &Categories, 0, NULL, 0, NULL };
//---------------------------------------------------------------------------
// The Main stream header
//---------------------------------------------------------------------------
static HW_STREAM_HEADER StreamHeader = { DRIVER_STREAM_COUNT, // NumberOfStreams
sizeof (HW_STREAM_INFORMATION), // Future proofing
0, // NumDevPropArrayEntries set at init time
NULL, // DevicePropertiesArray set at init time
0, // NumDevEventArrayEntries;
NULL, // DeviceEventsArray;
&Topology // Pointer to Device Topology
};
#ifdef __cplusplus
} #endif // __cplusplus
#endif // __CODSTRM_H__
|