![Mauro Carvalho Chehab](/assets/img/avatar_default.png)
Finally, adds the content of README.vbi at cx2341x.rst after its conversion to ReST format. Now, add information about this chipset and its driver is inside a single chapter at the media/v4l-drivers book. Signed-off-by: Mauro Carvalho Chehab <mchehab@s-opensource.com>
3859 lines
75 KiB
ReStructuredText
3859 lines
75 KiB
ReStructuredText
The cx2341x driver
|
|
==================
|
|
|
|
Memory at cx2341x chips
|
|
-----------------------
|
|
|
|
This section describes the cx2341x memory map and documents some of the
|
|
register space.
|
|
|
|
.. note:: the memory long words are little-endian ('intel format').
|
|
|
|
.. warning::
|
|
|
|
This information was figured out from searching through the memory
|
|
and registers, this information may not be correct and is certainly
|
|
not complete, and was not derived from anything more than searching
|
|
through the memory space with commands like:
|
|
|
|
.. code-block:: none
|
|
|
|
ivtvctl -O min=0x02000000,max=0x020000ff
|
|
|
|
So take this as is, I'm always searching for more stuff, it's a large
|
|
register space :-).
|
|
|
|
Memory Map
|
|
~~~~~~~~~~
|
|
|
|
The cx2341x exposes its entire 64M memory space to the PCI host via the PCI BAR0
|
|
(Base Address Register 0). The addresses here are offsets relative to the
|
|
address held in BAR0.
|
|
|
|
.. code-block:: none
|
|
|
|
0x00000000-0x00ffffff Encoder memory space
|
|
0x00000000-0x0003ffff Encode.rom
|
|
???-??? MPEG buffer(s)
|
|
???-??? Raw video capture buffer(s)
|
|
???-??? Raw audio capture buffer(s)
|
|
???-??? Display buffers (6 or 9)
|
|
|
|
0x01000000-0x01ffffff Decoder memory space
|
|
0x01000000-0x0103ffff Decode.rom
|
|
???-??? MPEG buffers(s)
|
|
0x0114b000-0x0115afff Audio.rom (deprecated?)
|
|
|
|
0x02000000-0x0200ffff Register Space
|
|
|
|
Registers
|
|
~~~~~~~~~
|
|
|
|
The registers occupy the 64k space starting at the 0x02000000 offset from BAR0.
|
|
All of these registers are 32 bits wide.
|
|
|
|
.. code-block:: none
|
|
|
|
DMA Registers 0x000-0xff:
|
|
|
|
0x00 - Control:
|
|
0=reset/cancel, 1=read, 2=write, 4=stop
|
|
0x04 - DMA status:
|
|
1=read busy, 2=write busy, 4=read error, 8=write error, 16=link list error
|
|
0x08 - pci DMA pointer for read link list
|
|
0x0c - pci DMA pointer for write link list
|
|
0x10 - read/write DMA enable:
|
|
1=read enable, 2=write enable
|
|
0x14 - always 0xffffffff, if set any lower instability occurs, 0x00 crashes
|
|
0x18 - ??
|
|
0x1c - always 0x20 or 32, smaller values slow down DMA transactions
|
|
0x20 - always value of 0x780a010a
|
|
0x24-0x3c - usually just random values???
|
|
0x40 - Interrupt status
|
|
0x44 - Write a bit here and shows up in Interrupt status 0x40
|
|
0x48 - Interrupt Mask
|
|
0x4C - always value of 0xfffdffff,
|
|
if changed to 0xffffffff DMA write interrupts break.
|
|
0x50 - always 0xffffffff
|
|
0x54 - always 0xffffffff (0x4c, 0x50, 0x54 seem like interrupt masks, are
|
|
3 processors on chip, Java ones, VPU, SPU, APU, maybe these are the
|
|
interrupt masks???).
|
|
0x60-0x7C - random values
|
|
0x80 - first write linked list reg, for Encoder Memory addr
|
|
0x84 - first write linked list reg, for pci memory addr
|
|
0x88 - first write linked list reg, for length of buffer in memory addr
|
|
(|0x80000000 or this for last link)
|
|
0x8c-0xdc - rest of write linked list reg, 8 sets of 3 total, DMA goes here
|
|
from linked list addr in reg 0x0c, firmware must push through or
|
|
something.
|
|
0xe0 - first (and only) read linked list reg, for pci memory addr
|
|
0xe4 - first (and only) read linked list reg, for Decoder memory addr
|
|
0xe8 - first (and only) read linked list reg, for length of buffer
|
|
0xec-0xff - Nothing seems to be in these registers, 0xec-f4 are 0x00000000.
|
|
|
|
Memory locations for Encoder Buffers 0x700-0x7ff:
|
|
|
|
These registers show offsets of memory locations pertaining to each
|
|
buffer area used for encoding, have to shift them by <<1 first.
|
|
|
|
- 0x07F8: Encoder SDRAM refresh
|
|
- 0x07FC: Encoder SDRAM pre-charge
|
|
|
|
Memory locations for Decoder Buffers 0x800-0x8ff:
|
|
|
|
These registers show offsets of memory locations pertaining to each
|
|
buffer area used for decoding, have to shift them by <<1 first.
|
|
|
|
- 0x08F8: Decoder SDRAM refresh
|
|
- 0x08FC: Decoder SDRAM pre-charge
|
|
|
|
Other memory locations:
|
|
|
|
- 0x2800: Video Display Module control
|
|
- 0x2D00: AO (audio output?) control
|
|
- 0x2D24: Bytes Flushed
|
|
- 0x7000: LSB I2C write clock bit (inverted)
|
|
- 0x7004: LSB I2C write data bit (inverted)
|
|
- 0x7008: LSB I2C read clock bit
|
|
- 0x700c: LSB I2C read data bit
|
|
- 0x9008: GPIO get input state
|
|
- 0x900c: GPIO set output state
|
|
- 0x9020: GPIO direction (Bit7 (GPIO 0..7) - 0:input, 1:output)
|
|
- 0x9050: SPU control
|
|
- 0x9054: Reset HW blocks
|
|
- 0x9058: VPU control
|
|
- 0xA018: Bit6: interrupt pending?
|
|
- 0xA064: APU command
|
|
|
|
|
|
Interrupt Status Register
|
|
~~~~~~~~~~~~~~~~~~~~~~~~~
|
|
|
|
The definition of the bits in the interrupt status register 0x0040, and the
|
|
interrupt mask 0x0048. If a bit is cleared in the mask, then we want our ISR to
|
|
execute.
|
|
|
|
- bit 31 Encoder Start Capture
|
|
- bit 30 Encoder EOS
|
|
- bit 29 Encoder VBI capture
|
|
- bit 28 Encoder Video Input Module reset event
|
|
- bit 27 Encoder DMA complete
|
|
- bit 24 Decoder audio mode change detection event (through event notification)
|
|
- bit 22 Decoder data request
|
|
- bit 20 Decoder DMA complete
|
|
- bit 19 Decoder VBI re-insertion
|
|
- bit 18 Decoder DMA err (linked-list bad)
|
|
|
|
Missing documentation
|
|
---------------------
|
|
|
|
- Encoder API post(?)
|
|
- Decoder API post(?)
|
|
- Decoder VTRACE event
|
|
|
|
|
|
The cx2341x firmware upload
|
|
---------------------------
|
|
|
|
This document describes how to upload the cx2341x firmware to the card.
|
|
|
|
How to find
|
|
~~~~~~~~~~~
|
|
|
|
See the web pages of the various projects that uses this chip for information
|
|
on how to obtain the firmware.
|
|
|
|
The firmware stored in a Windows driver can be detected as follows:
|
|
|
|
- Each firmware image is 256k bytes.
|
|
- The 1st 32-bit word of the Encoder image is 0x0000da7
|
|
- The 1st 32-bit word of the Decoder image is 0x00003a7
|
|
- The 2nd 32-bit word of both images is 0xaa55bb66
|
|
|
|
How to load
|
|
~~~~~~~~~~~
|
|
|
|
- Issue the FWapi command to stop the encoder if it is running. Wait for the
|
|
command to complete.
|
|
- Issue the FWapi command to stop the decoder if it is running. Wait for the
|
|
command to complete.
|
|
- Issue the I2C command to the digitizer to stop emitting VSYNC events.
|
|
- Issue the FWapi command to halt the encoder's firmware.
|
|
- Sleep for 10ms.
|
|
- Issue the FWapi command to halt the decoder's firmware.
|
|
- Sleep for 10ms.
|
|
- Write 0x00000000 to register 0x2800 to stop the Video Display Module.
|
|
- Write 0x00000005 to register 0x2D00 to stop the AO (audio output?).
|
|
- Write 0x00000000 to register 0xA064 to ping? the APU.
|
|
- Write 0xFFFFFFFE to register 0x9058 to stop the VPU.
|
|
- Write 0xFFFFFFFF to register 0x9054 to reset the HW blocks.
|
|
- Write 0x00000001 to register 0x9050 to stop the SPU.
|
|
- Sleep for 10ms.
|
|
- Write 0x0000001A to register 0x07FC to init the Encoder SDRAM's pre-charge.
|
|
- Write 0x80000640 to register 0x07F8 to init the Encoder SDRAM's refresh to 1us.
|
|
- Write 0x0000001A to register 0x08FC to init the Decoder SDRAM's pre-charge.
|
|
- Write 0x80000640 to register 0x08F8 to init the Decoder SDRAM's refresh to 1us.
|
|
- Sleep for 512ms. (600ms is recommended)
|
|
- Transfer the encoder's firmware image to offset 0 in Encoder memory space.
|
|
- Transfer the decoder's firmware image to offset 0 in Decoder memory space.
|
|
- Use a read-modify-write operation to Clear bit 0 of register 0x9050 to
|
|
re-enable the SPU.
|
|
- Sleep for 1 second.
|
|
- Use a read-modify-write operation to Clear bits 3 and 0 of register 0x9058
|
|
to re-enable the VPU.
|
|
- Sleep for 1 second.
|
|
- Issue status API commands to both firmware images to verify.
|
|
|
|
|
|
How to call the firmware API
|
|
----------------------------
|
|
|
|
The preferred calling convention is known as the firmware mailbox. The
|
|
mailboxes are basically a fixed length array that serves as the call-stack.
|
|
|
|
Firmware mailboxes can be located by searching the encoder and decoder memory
|
|
for a 16 byte signature. That signature will be located on a 256-byte boundary.
|
|
|
|
Signature:
|
|
|
|
.. code-block:: none
|
|
|
|
0x78, 0x56, 0x34, 0x12, 0x12, 0x78, 0x56, 0x34,
|
|
0x34, 0x12, 0x78, 0x56, 0x56, 0x34, 0x12, 0x78
|
|
|
|
The firmware implements 20 mailboxes of 20 32-bit words. The first 10 are
|
|
reserved for API calls. The second 10 are used by the firmware for event
|
|
notification.
|
|
|
|
====== =================
|
|
Index Name
|
|
====== =================
|
|
0 Flags
|
|
1 Command
|
|
2 Return value
|
|
3 Timeout
|
|
4-19 Parameter/Result
|
|
====== =================
|
|
|
|
|
|
The flags are defined in the following table. The direction is from the
|
|
perspective of the firmware.
|
|
|
|
==== ========== ============================================
|
|
Bit Direction Purpose
|
|
==== ========== ============================================
|
|
2 O Firmware has processed the command.
|
|
1 I Driver has finished setting the parameters.
|
|
0 I Driver is using this mailbox.
|
|
==== ========== ============================================
|
|
|
|
The command is a 32-bit enumerator. The API specifics may be found in this
|
|
chapter.
|
|
|
|
The return value is a 32-bit enumerator. Only two values are currently defined:
|
|
|
|
- 0=success
|
|
- -1=command undefined.
|
|
|
|
There are 16 parameters/results 32-bit fields. The driver populates these fields
|
|
with values for all the parameters required by the call. The driver overwrites
|
|
these fields with result values returned by the call.
|
|
|
|
The timeout value protects the card from a hung driver thread. If the driver
|
|
doesn't handle the completed call within the timeout specified, the firmware
|
|
will reset that mailbox.
|
|
|
|
To make an API call, the driver iterates over each mailbox looking for the
|
|
first one available (bit 0 has been cleared). The driver sets that bit, fills
|
|
in the command enumerator, the timeout value and any required parameters. The
|
|
driver then sets the parameter ready bit (bit 1). The firmware scans the
|
|
mailboxes for pending commands, processes them, sets the result code, populates
|
|
the result value array with that call's return values and sets the call
|
|
complete bit (bit 2). Once bit 2 is set, the driver should retrieve the results
|
|
and clear all the flags. If the driver does not perform this task within the
|
|
time set in the timeout register, the firmware will reset that mailbox.
|
|
|
|
Event notifications are sent from the firmware to the host. The host tells the
|
|
firmware which events it is interested in via an API call. That call tells the
|
|
firmware which notification mailbox to use. The firmware signals the host via
|
|
an interrupt. Only the 16 Results fields are used, the Flags, Command, Return
|
|
value and Timeout words are not used.
|
|
|
|
|
|
OSD firmware API description
|
|
----------------------------
|
|
|
|
.. note:: this API is part of the decoder firmware, so it's cx23415 only.
|
|
|
|
|
|
|
|
CX2341X_OSD_GET_FRAMEBUFFER
|
|
~~~~~~~~~~~~~~~~~~~~~~~~~~~
|
|
|
|
Enum: 65/0x41
|
|
|
|
Description
|
|
^^^^^^^^^^^
|
|
|
|
Return base and length of contiguous OSD memory.
|
|
|
|
Result[0]
|
|
^^^^^^^^^
|
|
|
|
OSD base address
|
|
|
|
Result[1]
|
|
^^^^^^^^^
|
|
|
|
OSD length
|
|
|
|
|
|
|
|
CX2341X_OSD_GET_PIXEL_FORMAT
|
|
~~~~~~~~~~~~~~~~~~~~~~~~~~~~
|
|
|
|
Enum: 66/0x42
|
|
|
|
Description
|
|
^^^^^^^^^^^
|
|
|
|
Query OSD format
|
|
|
|
Result[0]
|
|
^^^^^^^^^
|
|
|
|
0=8bit index
|
|
1=16bit RGB 5:6:5
|
|
2=16bit ARGB 1:5:5:5
|
|
3=16bit ARGB 1:4:4:4
|
|
4=32bit ARGB 8:8:8:8
|
|
|
|
|
|
|
|
CX2341X_OSD_SET_PIXEL_FORMAT
|
|
~~~~~~~~~~~~~~~~~~~~~~~~~~~~
|
|
|
|
Enum: 67/0x43
|
|
|
|
Description
|
|
^^^^^^^^^^^
|
|
|
|
Assign pixel format
|
|
|
|
Param[0]
|
|
^^^^^^^^
|
|
|
|
- 0=8bit index
|
|
- 1=16bit RGB 5:6:5
|
|
- 2=16bit ARGB 1:5:5:5
|
|
- 3=16bit ARGB 1:4:4:4
|
|
- 4=32bit ARGB 8:8:8:8
|
|
|
|
|
|
|
|
CX2341X_OSD_GET_STATE
|
|
~~~~~~~~~~~~~~~~~~~~~
|
|
|
|
Enum: 68/0x44
|
|
|
|
Description
|
|
^^^^^^^^^^^
|
|
|
|
Query OSD state
|
|
|
|
Result[0]
|
|
^^^^^^^^^
|
|
|
|
- Bit 0 0=off, 1=on
|
|
- Bits 1:2 alpha control
|
|
- Bits 3:5 pixel format
|
|
|
|
|
|
|
|
CX2341X_OSD_SET_STATE
|
|
~~~~~~~~~~~~~~~~~~~~~
|
|
|
|
Enum: 69/0x45
|
|
|
|
Description
|
|
^^^^^^^^^^^
|
|
|
|
OSD switch
|
|
|
|
Param[0]
|
|
^^^^^^^^
|
|
|
|
0=off, 1=on
|
|
|
|
|
|
|
|
CX2341X_OSD_GET_OSD_COORDS
|
|
~~~~~~~~~~~~~~~~~~~~~~~~~~
|
|
|
|
Enum: 70/0x46
|
|
|
|
Description
|
|
^^^^^^^^^^^
|
|
|
|
Retrieve coordinates of OSD area blended with video
|
|
|
|
Result[0]
|
|
^^^^^^^^^
|
|
|
|
OSD buffer address
|
|
|
|
Result[1]
|
|
^^^^^^^^^
|
|
|
|
Stride in pixels
|
|
|
|
Result[2]
|
|
^^^^^^^^^
|
|
|
|
Lines in OSD buffer
|
|
|
|
Result[3]
|
|
^^^^^^^^^
|
|
|
|
Horizontal offset in buffer
|
|
|
|
Result[4]
|
|
^^^^^^^^^
|
|
|
|
Vertical offset in buffer
|
|
|
|
|
|
|
|
CX2341X_OSD_SET_OSD_COORDS
|
|
~~~~~~~~~~~~~~~~~~~~~~~~~~
|
|
|
|
Enum: 71/0x47
|
|
|
|
Description
|
|
^^^^^^^^^^^
|
|
|
|
Assign the coordinates of the OSD area to blend with video
|
|
|
|
Param[0]
|
|
^^^^^^^^
|
|
|
|
buffer address
|
|
|
|
Param[1]
|
|
^^^^^^^^
|
|
|
|
buffer stride in pixels
|
|
|
|
Param[2]
|
|
^^^^^^^^
|
|
|
|
lines in buffer
|
|
|
|
Param[3]
|
|
^^^^^^^^
|
|
|
|
horizontal offset
|
|
|
|
Param[4]
|
|
^^^^^^^^
|
|
|
|
vertical offset
|
|
|
|
|
|
|
|
CX2341X_OSD_GET_SCREEN_COORDS
|
|
~~~~~~~~~~~~~~~~~~~~~~~~~~~~~
|
|
|
|
Enum: 72/0x48
|
|
|
|
Description
|
|
^^^^^^^^^^^
|
|
|
|
Retrieve OSD screen area coordinates
|
|
|
|
Result[0]
|
|
^^^^^^^^^
|
|
|
|
top left horizontal offset
|
|
|
|
Result[1]
|
|
^^^^^^^^^
|
|
|
|
top left vertical offset
|
|
|
|
Result[2]
|
|
^^^^^^^^^
|
|
|
|
bottom right horizontal offset
|
|
|
|
Result[3]
|
|
^^^^^^^^^
|
|
|
|
bottom right vertical offset
|
|
|
|
|
|
|
|
CX2341X_OSD_SET_SCREEN_COORDS
|
|
~~~~~~~~~~~~~~~~~~~~~~~~~~~~~
|
|
|
|
Enum: 73/0x49
|
|
|
|
Description
|
|
^^^^^^^^^^^
|
|
|
|
Assign the coordinates of the screen area to blend with video
|
|
|
|
Param[0]
|
|
^^^^^^^^
|
|
|
|
top left horizontal offset
|
|
|
|
Param[1]
|
|
^^^^^^^^
|
|
|
|
top left vertical offset
|
|
|
|
Param[2]
|
|
^^^^^^^^
|
|
|
|
bottom left horizontal offset
|
|
|
|
Param[3]
|
|
^^^^^^^^
|
|
|
|
bottom left vertical offset
|
|
|
|
|
|
|
|
CX2341X_OSD_GET_GLOBAL_ALPHA
|
|
~~~~~~~~~~~~~~~~~~~~~~~~~~~~
|
|
|
|
Enum: 74/0x4A
|
|
|
|
Description
|
|
^^^^^^^^^^^
|
|
|
|
Retrieve OSD global alpha
|
|
|
|
Result[0]
|
|
^^^^^^^^^
|
|
|
|
global alpha: 0=off, 1=on
|
|
|
|
Result[1]
|
|
^^^^^^^^^
|
|
|
|
bits 0:7 global alpha
|
|
|
|
|
|
|
|
CX2341X_OSD_SET_GLOBAL_ALPHA
|
|
~~~~~~~~~~~~~~~~~~~~~~~~~~~~
|
|
|
|
Enum: 75/0x4B
|
|
|
|
Description
|
|
^^^^^^^^^^^
|
|
|
|
Update global alpha
|
|
|
|
Param[0]
|
|
^^^^^^^^
|
|
|
|
global alpha: 0=off, 1=on
|
|
|
|
Param[1]
|
|
^^^^^^^^
|
|
|
|
global alpha (8 bits)
|
|
|
|
Param[2]
|
|
^^^^^^^^
|
|
|
|
local alpha: 0=on, 1=off
|
|
|
|
|
|
|
|
CX2341X_OSD_SET_BLEND_COORDS
|
|
~~~~~~~~~~~~~~~~~~~~~~~~~~~~
|
|
|
|
Enum: 78/0x4C
|
|
|
|
Description
|
|
^^^^^^^^^^^
|
|
|
|
Move start of blending area within display buffer
|
|
|
|
Param[0]
|
|
^^^^^^^^
|
|
|
|
horizontal offset in buffer
|
|
|
|
Param[1]
|
|
^^^^^^^^
|
|
|
|
vertical offset in buffer
|
|
|
|
|
|
|
|
CX2341X_OSD_GET_FLICKER_STATE
|
|
~~~~~~~~~~~~~~~~~~~~~~~~~~~~~
|
|
|
|
Enum: 79/0x4F
|
|
|
|
Description
|
|
^^^^^^^^^^^
|
|
|
|
Retrieve flicker reduction module state
|
|
|
|
Result[0]
|
|
^^^^^^^^^
|
|
|
|
flicker state: 0=off, 1=on
|
|
|
|
|
|
|
|
CX2341X_OSD_SET_FLICKER_STATE
|
|
~~~~~~~~~~~~~~~~~~~~~~~~~~~~~
|
|
|
|
Enum: 80/0x50
|
|
|
|
Description
|
|
^^^^^^^^^^^
|
|
|
|
Set flicker reduction module state
|
|
|
|
Param[0]
|
|
^^^^^^^^
|
|
|
|
State: 0=off, 1=on
|
|
|
|
|
|
|
|
CX2341X_OSD_BLT_COPY
|
|
~~~~~~~~~~~~~~~~~~~~
|
|
|
|
Enum: 82/0x52
|
|
|
|
Description
|
|
^^^^^^^^^^^
|
|
|
|
BLT copy
|
|
|
|
Param[0]
|
|
^^^^^^^^
|
|
|
|
.. code-block:: none
|
|
|
|
'0000' zero
|
|
'0001' ~destination AND ~source
|
|
'0010' ~destination AND source
|
|
'0011' ~destination
|
|
'0100' destination AND ~source
|
|
'0101' ~source
|
|
'0110' destination XOR source
|
|
'0111' ~destination OR ~source
|
|
'1000' ~destination AND ~source
|
|
'1001' destination XNOR source
|
|
'1010' source
|
|
'1011' ~destination OR source
|
|
'1100' destination
|
|
'1101' destination OR ~source
|
|
'1110' destination OR source
|
|
'1111' one
|
|
|
|
|
|
Param[1]
|
|
^^^^^^^^
|
|
|
|
Resulting alpha blending
|
|
|
|
- '01' source_alpha
|
|
- '10' destination_alpha
|
|
- '11' source_alpha*destination_alpha+1
|
|
(zero if both source and destination alpha are zero)
|
|
|
|
Param[2]
|
|
^^^^^^^^
|
|
|
|
.. code-block:: none
|
|
|
|
'00' output_pixel = source_pixel
|
|
|
|
'01' if source_alpha=0:
|
|
output_pixel = destination_pixel
|
|
if 256 > source_alpha > 1:
|
|
output_pixel = ((source_alpha + 1)*source_pixel +
|
|
(255 - source_alpha)*destination_pixel)/256
|
|
|
|
'10' if destination_alpha=0:
|
|
output_pixel = source_pixel
|
|
if 255 > destination_alpha > 0:
|
|
output_pixel = ((255 - destination_alpha)*source_pixel +
|
|
(destination_alpha + 1)*destination_pixel)/256
|
|
|
|
'11' if source_alpha=0:
|
|
source_temp = 0
|
|
if source_alpha=255:
|
|
source_temp = source_pixel*256
|
|
if 255 > source_alpha > 0:
|
|
source_temp = source_pixel*(source_alpha + 1)
|
|
if destination_alpha=0:
|
|
destination_temp = 0
|
|
if destination_alpha=255:
|
|
destination_temp = destination_pixel*256
|
|
if 255 > destination_alpha > 0:
|
|
destination_temp = destination_pixel*(destination_alpha + 1)
|
|
output_pixel = (source_temp + destination_temp)/256
|
|
|
|
Param[3]
|
|
^^^^^^^^
|
|
|
|
width
|
|
|
|
Param[4]
|
|
^^^^^^^^
|
|
|
|
height
|
|
|
|
Param[5]
|
|
^^^^^^^^
|
|
|
|
destination pixel mask
|
|
|
|
Param[6]
|
|
^^^^^^^^
|
|
|
|
destination rectangle start address
|
|
|
|
Param[7]
|
|
^^^^^^^^
|
|
|
|
destination stride in dwords
|
|
|
|
Param[8]
|
|
^^^^^^^^
|
|
|
|
source stride in dwords
|
|
|
|
Param[9]
|
|
^^^^^^^^
|
|
|
|
source rectangle start address
|
|
|
|
|
|
|
|
CX2341X_OSD_BLT_FILL
|
|
~~~~~~~~~~~~~~~~~~~~
|
|
|
|
Enum: 83/0x53
|
|
|
|
Description
|
|
^^^^^^^^^^^
|
|
|
|
BLT fill color
|
|
|
|
Param[0]
|
|
^^^^^^^^
|
|
|
|
Same as Param[0] on API 0x52
|
|
|
|
Param[1]
|
|
^^^^^^^^
|
|
|
|
Same as Param[1] on API 0x52
|
|
|
|
Param[2]
|
|
^^^^^^^^
|
|
|
|
Same as Param[2] on API 0x52
|
|
|
|
Param[3]
|
|
^^^^^^^^
|
|
|
|
width
|
|
|
|
Param[4]
|
|
^^^^^^^^
|
|
|
|
height
|
|
|
|
Param[5]
|
|
^^^^^^^^
|
|
|
|
destination pixel mask
|
|
|
|
Param[6]
|
|
^^^^^^^^
|
|
|
|
destination rectangle start address
|
|
|
|
Param[7]
|
|
^^^^^^^^
|
|
|
|
destination stride in dwords
|
|
|
|
Param[8]
|
|
^^^^^^^^
|
|
|
|
color fill value
|
|
|
|
|
|
|
|
CX2341X_OSD_BLT_TEXT
|
|
~~~~~~~~~~~~~~~~~~~~
|
|
|
|
Enum: 84/0x54
|
|
|
|
Description
|
|
^^^^^^^^^^^
|
|
|
|
BLT for 8 bit alpha text source
|
|
|
|
Param[0]
|
|
^^^^^^^^
|
|
|
|
Same as Param[0] on API 0x52
|
|
|
|
Param[1]
|
|
^^^^^^^^
|
|
|
|
Same as Param[1] on API 0x52
|
|
|
|
Param[2]
|
|
^^^^^^^^
|
|
|
|
Same as Param[2] on API 0x52
|
|
|
|
Param[3]
|
|
^^^^^^^^
|
|
|
|
width
|
|
|
|
Param[4]
|
|
^^^^^^^^
|
|
|
|
height
|
|
|
|
Param[5]
|
|
^^^^^^^^
|
|
|
|
destination pixel mask
|
|
|
|
Param[6]
|
|
^^^^^^^^
|
|
|
|
destination rectangle start address
|
|
|
|
Param[7]
|
|
^^^^^^^^
|
|
|
|
destination stride in dwords
|
|
|
|
Param[8]
|
|
^^^^^^^^
|
|
|
|
source stride in dwords
|
|
|
|
Param[9]
|
|
^^^^^^^^
|
|
|
|
source rectangle start address
|
|
|
|
Param[10]
|
|
^^^^^^^^^
|
|
|
|
color fill value
|
|
|
|
|
|
|
|
CX2341X_OSD_SET_FRAMEBUFFER_WINDOW
|
|
~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~
|
|
|
|
Enum: 86/0x56
|
|
|
|
Description
|
|
^^^^^^^^^^^
|
|
|
|
Positions the main output window on the screen. The coordinates must be
|
|
such that the entire window fits on the screen.
|
|
|
|
Param[0]
|
|
^^^^^^^^
|
|
|
|
window width
|
|
|
|
Param[1]
|
|
^^^^^^^^
|
|
|
|
window height
|
|
|
|
Param[2]
|
|
^^^^^^^^
|
|
|
|
top left window corner horizontal offset
|
|
|
|
Param[3]
|
|
^^^^^^^^
|
|
|
|
top left window corner vertical offset
|
|
|
|
|
|
|
|
CX2341X_OSD_SET_CHROMA_KEY
|
|
~~~~~~~~~~~~~~~~~~~~~~~~~~
|
|
|
|
Enum: 96/0x60
|
|
|
|
Description
|
|
^^^^^^^^^^^
|
|
|
|
Chroma key switch and color
|
|
|
|
Param[0]
|
|
^^^^^^^^
|
|
|
|
state: 0=off, 1=on
|
|
|
|
Param[1]
|
|
^^^^^^^^
|
|
|
|
color
|
|
|
|
|
|
|
|
CX2341X_OSD_GET_ALPHA_CONTENT_INDEX
|
|
~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~
|
|
|
|
Enum: 97/0x61
|
|
|
|
Description
|
|
^^^^^^^^^^^
|
|
|
|
Retrieve alpha content index
|
|
|
|
Result[0]
|
|
^^^^^^^^^
|
|
|
|
alpha content index, Range 0:15
|
|
|
|
|
|
|
|
CX2341X_OSD_SET_ALPHA_CONTENT_INDEX
|
|
~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~
|
|
|
|
Enum: 98/0x62
|
|
|
|
Description
|
|
^^^^^^^^^^^
|
|
|
|
Assign alpha content index
|
|
|
|
Param[0]
|
|
^^^^^^^^
|
|
|
|
alpha content index, range 0:15
|
|
|
|
|
|
Encoder firmware API description
|
|
--------------------------------
|
|
|
|
CX2341X_ENC_PING_FW
|
|
~~~~~~~~~~~~~~~~~~~
|
|
|
|
Enum: 128/0x80
|
|
|
|
Description
|
|
^^^^^^^^^^^
|
|
|
|
Does nothing. Can be used to check if the firmware is responding.
|
|
|
|
|
|
|
|
CX2341X_ENC_START_CAPTURE
|
|
~~~~~~~~~~~~~~~~~~~~~~~~~
|
|
|
|
Enum: 129/0x81
|
|
|
|
Description
|
|
^^^^^^^^^^^
|
|
|
|
Commences the capture of video, audio and/or VBI data. All encoding
|
|
parameters must be initialized prior to this API call. Captures frames
|
|
continuously or until a predefined number of frames have been captured.
|
|
|
|
Param[0]
|
|
^^^^^^^^
|
|
|
|
Capture stream type:
|
|
|
|
- 0=MPEG
|
|
- 1=Raw
|
|
- 2=Raw passthrough
|
|
- 3=VBI
|
|
|
|
|
|
Param[1]
|
|
^^^^^^^^
|
|
|
|
Bitmask:
|
|
|
|
- Bit 0 when set, captures YUV
|
|
- Bit 1 when set, captures PCM audio
|
|
- Bit 2 when set, captures VBI (same as param[0]=3)
|
|
- Bit 3 when set, the capture destination is the decoder
|
|
(same as param[0]=2)
|
|
- Bit 4 when set, the capture destination is the host
|
|
|
|
.. note:: this parameter is only meaningful for RAW capture type.
|
|
|
|
|
|
|
|
CX2341X_ENC_STOP_CAPTURE
|
|
~~~~~~~~~~~~~~~~~~~~~~~~
|
|
|
|
Enum: 130/0x82
|
|
|
|
Description
|
|
^^^^^^^^^^^
|
|
|
|
Ends a capture in progress
|
|
|
|
Param[0]
|
|
^^^^^^^^
|
|
|
|
- 0=stop at end of GOP (generates IRQ)
|
|
- 1=stop immediate (no IRQ)
|
|
|
|
Param[1]
|
|
^^^^^^^^
|
|
|
|
Stream type to stop, see param[0] of API 0x81
|
|
|
|
Param[2]
|
|
^^^^^^^^
|
|
|
|
Subtype, see param[1] of API 0x81
|
|
|
|
|
|
|
|
CX2341X_ENC_SET_AUDIO_ID
|
|
~~~~~~~~~~~~~~~~~~~~~~~~
|
|
|
|
Enum: 137/0x89
|
|
|
|
Description
|
|
^^^^^^^^^^^
|
|
|
|
Assigns the transport stream ID of the encoded audio stream
|
|
|
|
Param[0]
|
|
^^^^^^^^
|
|
|
|
Audio Stream ID
|
|
|
|
|
|
|
|
CX2341X_ENC_SET_VIDEO_ID
|
|
~~~~~~~~~~~~~~~~~~~~~~~~
|
|
|
|
Enum: 139/0x8B
|
|
|
|
Description
|
|
^^^^^^^^^^^
|
|
|
|
Set video transport stream ID
|
|
|
|
Param[0]
|
|
^^^^^^^^
|
|
|
|
Video stream ID
|
|
|
|
|
|
|
|
CX2341X_ENC_SET_PCR_ID
|
|
~~~~~~~~~~~~~~~~~~~~~~
|
|
|
|
Enum: 141/0x8D
|
|
|
|
Description
|
|
^^^^^^^^^^^
|
|
|
|
Assigns the transport stream ID for PCR packets
|
|
|
|
Param[0]
|
|
^^^^^^^^
|
|
|
|
PCR Stream ID
|
|
|
|
|
|
|
|
CX2341X_ENC_SET_FRAME_RATE
|
|
~~~~~~~~~~~~~~~~~~~~~~~~~~
|
|
|
|
Enum: 143/0x8F
|
|
|
|
Description
|
|
^^^^^^^^^^^
|
|
|
|
Set video frames per second. Change occurs at start of new GOP.
|
|
|
|
Param[0]
|
|
^^^^^^^^
|
|
|
|
- 0=30fps
|
|
- 1=25fps
|
|
|
|
|
|
|
|
CX2341X_ENC_SET_FRAME_SIZE
|
|
~~~~~~~~~~~~~~~~~~~~~~~~~~
|
|
|
|
Enum: 145/0x91
|
|
|
|
Description
|
|
^^^^^^^^^^^
|
|
|
|
Select video stream encoding resolution.
|
|
|
|
Param[0]
|
|
^^^^^^^^
|
|
|
|
Height in lines. Default 480
|
|
|
|
Param[1]
|
|
^^^^^^^^
|
|
|
|
Width in pixels. Default 720
|
|
|
|
|
|
|
|
CX2341X_ENC_SET_BIT_RATE
|
|
~~~~~~~~~~~~~~~~~~~~~~~~
|
|
|
|
Enum: 149/0x95
|
|
|
|
Description
|
|
^^^^^^^^^^^
|
|
|
|
Assign average video stream bitrate.
|
|
|
|
Param[0]
|
|
^^^^^^^^
|
|
|
|
0=variable bitrate, 1=constant bitrate
|
|
|
|
Param[1]
|
|
^^^^^^^^
|
|
|
|
bitrate in bits per second
|
|
|
|
Param[2]
|
|
^^^^^^^^
|
|
|
|
peak bitrate in bits per second, divided by 400
|
|
|
|
Param[3]
|
|
^^^^^^^^
|
|
|
|
Mux bitrate in bits per second, divided by 400. May be 0 (default).
|
|
|
|
Param[4]
|
|
^^^^^^^^
|
|
|
|
Rate Control VBR Padding
|
|
|
|
Param[5]
|
|
^^^^^^^^
|
|
|
|
VBV Buffer used by encoder
|
|
|
|
.. note::
|
|
|
|
#) Param\[3\] and Param\[4\] seem to be always 0
|
|
#) Param\[5\] doesn't seem to be used.
|
|
|
|
|
|
|
|
CX2341X_ENC_SET_GOP_PROPERTIES
|
|
~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~
|
|
|
|
Enum: 151/0x97
|
|
|
|
Description
|
|
^^^^^^^^^^^
|
|
|
|
Setup the GOP structure
|
|
|
|
Param[0]
|
|
^^^^^^^^
|
|
|
|
GOP size (maximum is 34)
|
|
|
|
Param[1]
|
|
^^^^^^^^
|
|
|
|
Number of B frames between the I and P frame, plus 1.
|
|
For example: IBBPBBPBBPBB --> GOP size: 12, number of B frames: 2+1 = 3
|
|
|
|
.. note::
|
|
|
|
GOP size must be a multiple of (B-frames + 1).
|
|
|
|
|
|
|
|
CX2341X_ENC_SET_ASPECT_RATIO
|
|
~~~~~~~~~~~~~~~~~~~~~~~~~~~~
|
|
|
|
Enum: 153/0x99
|
|
|
|
Description
|
|
^^^^^^^^^^^
|
|
|
|
Sets the encoding aspect ratio. Changes in the aspect ratio take effect
|
|
at the start of the next GOP.
|
|
|
|
Param[0]
|
|
^^^^^^^^
|
|
|
|
- '0000' forbidden
|
|
- '0001' 1:1 square
|
|
- '0010' 4:3
|
|
- '0011' 16:9
|
|
- '0100' 2.21:1
|
|
- '0101' to '1111' reserved
|
|
|
|
|
|
|
|
CX2341X_ENC_SET_DNR_FILTER_MODE
|
|
~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~
|
|
|
|
Enum: 155/0x9B
|
|
|
|
Description
|
|
^^^^^^^^^^^
|
|
|
|
Assign Dynamic Noise Reduction operating mode
|
|
|
|
Param[0]
|
|
^^^^^^^^
|
|
|
|
Bit0: Spatial filter, set=auto, clear=manual
|
|
Bit1: Temporal filter, set=auto, clear=manual
|
|
|
|
Param[1]
|
|
^^^^^^^^
|
|
|
|
Median filter:
|
|
|
|
- 0=Disabled
|
|
- 1=Horizontal
|
|
- 2=Vertical
|
|
- 3=Horiz/Vert
|
|
- 4=Diagonal
|
|
|
|
|
|
|
|
CX2341X_ENC_SET_DNR_FILTER_PROPS
|
|
~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~
|
|
|
|
Enum: 157/0x9D
|
|
|
|
Description
|
|
^^^^^^^^^^^
|
|
|
|
These Dynamic Noise Reduction filter values are only meaningful when
|
|
the respective filter is set to "manual" (See API 0x9B)
|
|
|
|
Param[0]
|
|
^^^^^^^^
|
|
|
|
Spatial filter: default 0, range 0:15
|
|
|
|
Param[1]
|
|
^^^^^^^^
|
|
|
|
Temporal filter: default 0, range 0:31
|
|
|
|
|
|
|
|
CX2341X_ENC_SET_CORING_LEVELS
|
|
~~~~~~~~~~~~~~~~~~~~~~~~~~~~~
|
|
|
|
Enum: 159/0x9F
|
|
|
|
Description
|
|
^^^^^^^^^^^
|
|
|
|
Assign Dynamic Noise Reduction median filter properties.
|
|
|
|
Param[0]
|
|
^^^^^^^^
|
|
|
|
Threshold above which the luminance median filter is enabled.
|
|
Default: 0, range 0:255
|
|
|
|
Param[1]
|
|
^^^^^^^^
|
|
|
|
Threshold below which the luminance median filter is enabled.
|
|
Default: 255, range 0:255
|
|
|
|
Param[2]
|
|
^^^^^^^^
|
|
|
|
Threshold above which the chrominance median filter is enabled.
|
|
Default: 0, range 0:255
|
|
|
|
Param[3]
|
|
^^^^^^^^
|
|
|
|
Threshold below which the chrominance median filter is enabled.
|
|
Default: 255, range 0:255
|
|
|
|
|
|
|
|
CX2341X_ENC_SET_SPATIAL_FILTER_TYPE
|
|
~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~
|
|
|
|
Enum: 161/0xA1
|
|
|
|
Description
|
|
^^^^^^^^^^^
|
|
|
|
Assign spatial prefilter parameters
|
|
|
|
Param[0]
|
|
^^^^^^^^
|
|
|
|
Luminance filter
|
|
|
|
- 0=Off
|
|
- 1=1D Horizontal
|
|
- 2=1D Vertical
|
|
- 3=2D H/V Separable (default)
|
|
- 4=2D Symmetric non-separable
|
|
|
|
Param[1]
|
|
^^^^^^^^
|
|
|
|
Chrominance filter
|
|
|
|
- 0=Off
|
|
- 1=1D Horizontal (default)
|
|
|
|
|
|
|
|
CX2341X_ENC_SET_VBI_LINE
|
|
~~~~~~~~~~~~~~~~~~~~~~~~
|
|
|
|
Enum: 183/0xB7
|
|
|
|
Description
|
|
^^^^^^^^^^^
|
|
|
|
Selects VBI line number.
|
|
|
|
Param[0]
|
|
^^^^^^^^
|
|
|
|
- Bits 0:4 line number
|
|
- Bit 31 0=top_field, 1=bottom_field
|
|
- Bits 0:31 all set specifies "all lines"
|
|
|
|
Param[1]
|
|
^^^^^^^^
|
|
|
|
VBI line information features: 0=disabled, 1=enabled
|
|
|
|
Param[2]
|
|
^^^^^^^^
|
|
|
|
Slicing: 0=None, 1=Closed Caption
|
|
Almost certainly not implemented. Set to 0.
|
|
|
|
Param[3]
|
|
^^^^^^^^
|
|
|
|
Luminance samples in this line.
|
|
Almost certainly not implemented. Set to 0.
|
|
|
|
Param[4]
|
|
^^^^^^^^
|
|
|
|
Chrominance samples in this line
|
|
Almost certainly not implemented. Set to 0.
|
|
|
|
|
|
|
|
CX2341X_ENC_SET_STREAM_TYPE
|
|
~~~~~~~~~~~~~~~~~~~~~~~~~~~
|
|
|
|
Enum: 185/0xB9
|
|
|
|
Description
|
|
^^^^^^^^^^^
|
|
|
|
Assign stream type
|
|
|
|
.. note::
|
|
|
|
Transport stream is not working in recent firmwares.
|
|
And in older firmwares the timestamps in the TS seem to be
|
|
unreliable.
|
|
|
|
Param[0]
|
|
^^^^^^^^
|
|
|
|
- 0=Program stream
|
|
- 1=Transport stream
|
|
- 2=MPEG1 stream
|
|
- 3=PES A/V stream
|
|
- 5=PES Video stream
|
|
- 7=PES Audio stream
|
|
- 10=DVD stream
|
|
- 11=VCD stream
|
|
- 12=SVCD stream
|
|
- 13=DVD_S1 stream
|
|
- 14=DVD_S2 stream
|
|
|
|
|
|
|
|
CX2341X_ENC_SET_OUTPUT_PORT
|
|
~~~~~~~~~~~~~~~~~~~~~~~~~~~
|
|
|
|
Enum: 187/0xBB
|
|
|
|
Description
|
|
^^^^^^^^^^^
|
|
|
|
Assign stream output port. Normally 0 when the data is copied through
|
|
the PCI bus (DMA), and 1 when the data is streamed to another chip
|
|
(pvrusb and cx88-blackbird).
|
|
|
|
Param[0]
|
|
^^^^^^^^
|
|
|
|
- 0=Memory (default)
|
|
- 1=Streaming
|
|
- 2=Serial
|
|
|
|
Param[1]
|
|
^^^^^^^^
|
|
|
|
Unknown, but leaving this to 0 seems to work best. Indications are that
|
|
this might have to do with USB support, although passing anything but 0
|
|
only breaks things.
|
|
|
|
|
|
|
|
CX2341X_ENC_SET_AUDIO_PROPERTIES
|
|
~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~
|
|
|
|
Enum: 189/0xBD
|
|
|
|
Description
|
|
^^^^^^^^^^^
|
|
|
|
Set audio stream properties, may be called while encoding is in progress.
|
|
|
|
.. note::
|
|
|
|
All bitfields are consistent with ISO11172 documentation except
|
|
bits 2:3 which ISO docs define as:
|
|
|
|
- '11' Layer I
|
|
- '10' Layer II
|
|
- '01' Layer III
|
|
- '00' Undefined
|
|
|
|
This discrepancy may indicate a possible error in the documentation.
|
|
Testing indicated that only Layer II is actually working, and that
|
|
the minimum bitrate should be 192 kbps.
|
|
|
|
Param[0]
|
|
^^^^^^^^
|
|
|
|
Bitmask:
|
|
|
|
.. code-block:: none
|
|
|
|
0:1 '00' 44.1Khz
|
|
'01' 48Khz
|
|
'10' 32Khz
|
|
'11' reserved
|
|
|
|
2:3 '01'=Layer I
|
|
'10'=Layer II
|
|
|
|
4:7 Bitrate:
|
|
Index | Layer I | Layer II
|
|
------+-------------+------------
|
|
'0000' | free format | free format
|
|
'0001' | 32 kbit/s | 32 kbit/s
|
|
'0010' | 64 kbit/s | 48 kbit/s
|
|
'0011' | 96 kbit/s | 56 kbit/s
|
|
'0100' | 128 kbit/s | 64 kbit/s
|
|
'0101' | 160 kbit/s | 80 kbit/s
|
|
'0110' | 192 kbit/s | 96 kbit/s
|
|
'0111' | 224 kbit/s | 112 kbit/s
|
|
'1000' | 256 kbit/s | 128 kbit/s
|
|
'1001' | 288 kbit/s | 160 kbit/s
|
|
'1010' | 320 kbit/s | 192 kbit/s
|
|
'1011' | 352 kbit/s | 224 kbit/s
|
|
'1100' | 384 kbit/s | 256 kbit/s
|
|
'1101' | 416 kbit/s | 320 kbit/s
|
|
'1110' | 448 kbit/s | 384 kbit/s
|
|
|
|
.. note::
|
|
|
|
For Layer II, not all combinations of total bitrate
|
|
and mode are allowed. See ISO11172-3 3-Annex B,
|
|
Table 3-B.2
|
|
|
|
8:9 '00'=Stereo
|
|
'01'=JointStereo
|
|
'10'=Dual
|
|
'11'=Mono
|
|
|
|
.. note::
|
|
|
|
The cx23415 cannot decode Joint Stereo properly.
|
|
|
|
10:11 Mode Extension used in joint_stereo mode.
|
|
In Layer I and II they indicate which subbands are in
|
|
intensity_stereo. All other subbands are coded in stereo.
|
|
'00' subbands 4-31 in intensity_stereo, bound==4
|
|
'01' subbands 8-31 in intensity_stereo, bound==8
|
|
'10' subbands 12-31 in intensity_stereo, bound==12
|
|
'11' subbands 16-31 in intensity_stereo, bound==16
|
|
|
|
12:13 Emphasis:
|
|
'00' None
|
|
'01' 50/15uS
|
|
'10' reserved
|
|
'11' CCITT J.17
|
|
|
|
14 CRC:
|
|
'0' off
|
|
'1' on
|
|
|
|
15 Copyright:
|
|
'0' off
|
|
'1' on
|
|
|
|
16 Generation:
|
|
'0' copy
|
|
'1' original
|
|
|
|
|
|
|
|
CX2341X_ENC_HALT_FW
|
|
~~~~~~~~~~~~~~~~~~~
|
|
|
|
Enum: 195/0xC3
|
|
|
|
Description
|
|
^^^^^^^^^^^
|
|
|
|
The firmware is halted and no further API calls are serviced until the
|
|
firmware is uploaded again.
|
|
|
|
|
|
|
|
CX2341X_ENC_GET_VERSION
|
|
~~~~~~~~~~~~~~~~~~~~~~~
|
|
|
|
Enum: 196/0xC4
|
|
|
|
Description
|
|
^^^^^^^^^^^
|
|
|
|
Returns the version of the encoder firmware.
|
|
|
|
Result[0]
|
|
^^^^^^^^^
|
|
|
|
Version bitmask:
|
|
- Bits 0:15 build
|
|
- Bits 16:23 minor
|
|
- Bits 24:31 major
|
|
|
|
|
|
|
|
CX2341X_ENC_SET_GOP_CLOSURE
|
|
~~~~~~~~~~~~~~~~~~~~~~~~~~~
|
|
|
|
Enum: 197/0xC5
|
|
|
|
Description
|
|
^^^^^^^^^^^
|
|
|
|
Assigns the GOP open/close property.
|
|
|
|
Param[0]
|
|
^^^^^^^^
|
|
|
|
- 0=Open
|
|
- 1=Closed
|
|
|
|
|
|
|
|
CX2341X_ENC_GET_SEQ_END
|
|
~~~~~~~~~~~~~~~~~~~~~~~
|
|
|
|
Enum: 198/0xC6
|
|
|
|
Description
|
|
^^^^^^^^^^^
|
|
|
|
Obtains the sequence end code of the encoder's buffer. When a capture
|
|
is started a number of interrupts are still generated, the last of
|
|
which will have Result[0] set to 1 and Result[1] will contain the size
|
|
of the buffer.
|
|
|
|
Result[0]
|
|
^^^^^^^^^
|
|
|
|
State of the transfer (1 if last buffer)
|
|
|
|
Result[1]
|
|
^^^^^^^^^
|
|
|
|
If Result[0] is 1, this contains the size of the last buffer, undefined
|
|
otherwise.
|
|
|
|
|
|
|
|
CX2341X_ENC_SET_PGM_INDEX_INFO
|
|
~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~
|
|
|
|
Enum: 199/0xC7
|
|
|
|
Description
|
|
^^^^^^^^^^^
|
|
|
|
Sets the Program Index Information.
|
|
The information is stored as follows:
|
|
|
|
.. code-block:: c
|
|
|
|
struct info {
|
|
u32 length; // Length of this frame
|
|
u32 offset_low; // Offset in the file of the
|
|
u32 offset_high; // start of this frame
|
|
u32 mask1; // Bits 0-2 are the type mask:
|
|
// 1=I, 2=P, 4=B
|
|
// 0=End of Program Index, other fields
|
|
// are invalid.
|
|
u32 pts; // The PTS of the frame
|
|
u32 mask2; // Bit 0 is bit 32 of the pts.
|
|
};
|
|
u32 table_ptr;
|
|
struct info index[400];
|
|
|
|
The table_ptr is the encoder memory address in the table were
|
|
*new* entries will be written.
|
|
|
|
.. note:: This is a ringbuffer, so the table_ptr will wraparound.
|
|
|
|
Param[0]
|
|
^^^^^^^^
|
|
|
|
Picture Mask:
|
|
- 0=No index capture
|
|
- 1=I frames
|
|
- 3=I,P frames
|
|
- 7=I,P,B frames
|
|
|
|
(Seems to be ignored, it always indexes I, P and B frames)
|
|
|
|
Param[1]
|
|
^^^^^^^^
|
|
|
|
Elements requested (up to 400)
|
|
|
|
Result[0]
|
|
^^^^^^^^^
|
|
|
|
Offset in the encoder memory of the start of the table.
|
|
|
|
Result[1]
|
|
^^^^^^^^^
|
|
|
|
Number of allocated elements up to a maximum of Param[1]
|
|
|
|
|
|
|
|
CX2341X_ENC_SET_VBI_CONFIG
|
|
~~~~~~~~~~~~~~~~~~~~~~~~~~
|
|
|
|
Enum: 200/0xC8
|
|
|
|
Description
|
|
^^^^^^^^^^^
|
|
|
|
Configure VBI settings
|
|
|
|
Param[0]
|
|
^^^^^^^^
|
|
|
|
Bitmap:
|
|
|
|
.. code-block:: none
|
|
|
|
0 Mode '0' Sliced, '1' Raw
|
|
1:3 Insertion:
|
|
'000' insert in extension & user data
|
|
'001' insert in private packets
|
|
'010' separate stream and user data
|
|
'111' separate stream and private data
|
|
8:15 Stream ID (normally 0xBD)
|
|
|
|
Param[1]
|
|
^^^^^^^^
|
|
|
|
Frames per interrupt (max 8). Only valid in raw mode.
|
|
|
|
Param[2]
|
|
^^^^^^^^
|
|
|
|
Total raw VBI frames. Only valid in raw mode.
|
|
|
|
Param[3]
|
|
^^^^^^^^
|
|
|
|
Start codes
|
|
|
|
Param[4]
|
|
^^^^^^^^
|
|
|
|
Stop codes
|
|
|
|
Param[5]
|
|
^^^^^^^^
|
|
|
|
Lines per frame
|
|
|
|
Param[6]
|
|
^^^^^^^^
|
|
|
|
Byte per line
|
|
|
|
Result[0]
|
|
^^^^^^^^^
|
|
|
|
Observed frames per interrupt in raw mode only. Rage 1 to Param[1]
|
|
|
|
Result[1]
|
|
^^^^^^^^^
|
|
|
|
Observed number of frames in raw mode. Range 1 to Param[2]
|
|
|
|
Result[2]
|
|
^^^^^^^^^
|
|
|
|
Memory offset to start or raw VBI data
|
|
|
|
|
|
|
|
CX2341X_ENC_SET_DMA_BLOCK_SIZE
|
|
~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~
|
|
|
|
Enum: 201/0xC9
|
|
|
|
Description
|
|
^^^^^^^^^^^
|
|
|
|
Set DMA transfer block size
|
|
|
|
Param[0]
|
|
^^^^^^^^
|
|
|
|
DMA transfer block size in bytes or frames. When unit is bytes,
|
|
supported block sizes are 2^7, 2^8 and 2^9 bytes.
|
|
|
|
Param[1]
|
|
^^^^^^^^
|
|
|
|
Unit: 0=bytes, 1=frames
|
|
|
|
|
|
|
|
CX2341X_ENC_GET_PREV_DMA_INFO_MB_10
|
|
~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~
|
|
|
|
Enum: 202/0xCA
|
|
|
|
Description
|
|
^^^^^^^^^^^
|
|
|
|
Returns information on the previous DMA transfer in conjunction with
|
|
bit 27 of the interrupt mask. Uses mailbox 10.
|
|
|
|
Result[0]
|
|
^^^^^^^^^
|
|
|
|
Type of stream
|
|
|
|
Result[1]
|
|
^^^^^^^^^
|
|
|
|
Address Offset
|
|
|
|
Result[2]
|
|
^^^^^^^^^
|
|
|
|
Maximum size of transfer
|
|
|
|
|
|
|
|
CX2341X_ENC_GET_PREV_DMA_INFO_MB_9
|
|
~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~
|
|
|
|
Enum: 203/0xCB
|
|
|
|
Description
|
|
^^^^^^^^^^^
|
|
|
|
Returns information on the previous DMA transfer in conjunction with
|
|
bit 27 or 18 of the interrupt mask. Uses mailbox 9.
|
|
|
|
Result[0]
|
|
^^^^^^^^^
|
|
|
|
Status bits:
|
|
- 0 read completed
|
|
- 1 write completed
|
|
- 2 DMA read error
|
|
- 3 DMA write error
|
|
- 4 Scatter-Gather array error
|
|
|
|
Result[1]
|
|
^^^^^^^^^
|
|
|
|
DMA type
|
|
|
|
Result[2]
|
|
^^^^^^^^^
|
|
|
|
Presentation Time Stamp bits 0..31
|
|
|
|
Result[3]
|
|
^^^^^^^^^
|
|
|
|
Presentation Time Stamp bit 32
|
|
|
|
|
|
|
|
CX2341X_ENC_SCHED_DMA_TO_HOST
|
|
~~~~~~~~~~~~~~~~~~~~~~~~~~~~~
|
|
|
|
Enum: 204/0xCC
|
|
|
|
Description
|
|
^^^^^^^^^^^
|
|
|
|
Setup DMA to host operation
|
|
|
|
Param[0]
|
|
^^^^^^^^
|
|
|
|
Memory address of link list
|
|
|
|
Param[1]
|
|
^^^^^^^^
|
|
|
|
Length of link list (wtf: what units ???)
|
|
|
|
Param[2]
|
|
^^^^^^^^
|
|
|
|
DMA type (0=MPEG)
|
|
|
|
|
|
|
|
CX2341X_ENC_INITIALIZE_INPUT
|
|
~~~~~~~~~~~~~~~~~~~~~~~~~~~~
|
|
|
|
Enum: 205/0xCD
|
|
|
|
Description
|
|
^^^^^^^^^^^
|
|
|
|
Initializes the video input
|
|
|
|
|
|
|
|
CX2341X_ENC_SET_FRAME_DROP_RATE
|
|
~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~
|
|
|
|
Enum: 208/0xD0
|
|
|
|
Description
|
|
^^^^^^^^^^^
|
|
|
|
For each frame captured, skip specified number of frames.
|
|
|
|
Param[0]
|
|
^^^^^^^^
|
|
|
|
Number of frames to skip
|
|
|
|
|
|
|
|
CX2341X_ENC_PAUSE_ENCODER
|
|
~~~~~~~~~~~~~~~~~~~~~~~~~
|
|
|
|
Enum: 210/0xD2
|
|
|
|
Description
|
|
^^^^^^^^^^^
|
|
|
|
During a pause condition, all frames are dropped instead of being encoded.
|
|
|
|
Param[0]
|
|
^^^^^^^^
|
|
|
|
- 0=Pause encoding
|
|
- 1=Continue encoding
|
|
|
|
|
|
|
|
CX2341X_ENC_REFRESH_INPUT
|
|
~~~~~~~~~~~~~~~~~~~~~~~~~
|
|
|
|
Enum: 211/0xD3
|
|
|
|
Description
|
|
^^^^^^^^^^^
|
|
|
|
Refreshes the video input
|
|
|
|
|
|
|
|
CX2341X_ENC_SET_COPYRIGHT
|
|
~~~~~~~~~~~~~~~~~~~~~~~~~
|
|
|
|
Enum: 212/0xD4
|
|
|
|
Description
|
|
^^^^^^^^^^^
|
|
|
|
Sets stream copyright property
|
|
|
|
Param[0]
|
|
^^^^^^^^
|
|
|
|
|
|
- 0=Stream is not copyrighted
|
|
- 1=Stream is copyrighted
|
|
|
|
|
|
|
|
CX2341X_ENC_SET_EVENT_NOTIFICATION
|
|
~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~
|
|
|
|
Enum: 213/0xD5
|
|
|
|
Description
|
|
^^^^^^^^^^^
|
|
|
|
Setup firmware to notify the host about a particular event. Host must
|
|
unmask the interrupt bit.
|
|
|
|
Param[0]
|
|
^^^^^^^^
|
|
|
|
Event (0=refresh encoder input)
|
|
|
|
Param[1]
|
|
^^^^^^^^
|
|
|
|
Notification 0=disabled 1=enabled
|
|
|
|
Param[2]
|
|
^^^^^^^^
|
|
|
|
Interrupt bit
|
|
|
|
Param[3]
|
|
^^^^^^^^
|
|
|
|
Mailbox slot, -1 if no mailbox required.
|
|
|
|
|
|
|
|
CX2341X_ENC_SET_NUM_VSYNC_LINES
|
|
~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~
|
|
|
|
Enum: 214/0xD6
|
|
|
|
Description
|
|
^^^^^^^^^^^
|
|
|
|
Depending on the analog video decoder used, this assigns the number
|
|
of lines for field 1 and 2.
|
|
|
|
Param[0]
|
|
^^^^^^^^
|
|
|
|
Field 1 number of lines:
|
|
- 0x00EF for SAA7114
|
|
- 0x00F0 for SAA7115
|
|
- 0x0105 for Micronas
|
|
|
|
Param[1]
|
|
^^^^^^^^
|
|
|
|
Field 2 number of lines:
|
|
- 0x00EF for SAA7114
|
|
- 0x00F0 for SAA7115
|
|
- 0x0106 for Micronas
|
|
|
|
|
|
|
|
CX2341X_ENC_SET_PLACEHOLDER
|
|
~~~~~~~~~~~~~~~~~~~~~~~~~~~
|
|
|
|
Enum: 215/0xD7
|
|
|
|
Description
|
|
^^^^^^^^^^^
|
|
|
|
Provides a mechanism of inserting custom user data in the MPEG stream.
|
|
|
|
Param[0]
|
|
^^^^^^^^
|
|
|
|
- 0=extension & user data
|
|
- 1=private packet with stream ID 0xBD
|
|
|
|
Param[1]
|
|
^^^^^^^^
|
|
|
|
Rate at which to insert data, in units of frames (for private packet)
|
|
or GOPs (for ext. & user data)
|
|
|
|
Param[2]
|
|
^^^^^^^^
|
|
|
|
Number of data DWORDs (below) to insert
|
|
|
|
Param[3]
|
|
^^^^^^^^
|
|
|
|
Custom data 0
|
|
|
|
Param[4]
|
|
^^^^^^^^
|
|
|
|
Custom data 1
|
|
|
|
Param[5]
|
|
^^^^^^^^
|
|
|
|
Custom data 2
|
|
|
|
Param[6]
|
|
^^^^^^^^
|
|
|
|
Custom data 3
|
|
|
|
Param[7]
|
|
^^^^^^^^
|
|
|
|
Custom data 4
|
|
|
|
Param[8]
|
|
^^^^^^^^
|
|
|
|
Custom data 5
|
|
|
|
Param[9]
|
|
^^^^^^^^
|
|
|
|
Custom data 6
|
|
|
|
Param[10]
|
|
^^^^^^^^^
|
|
|
|
Custom data 7
|
|
|
|
Param[11]
|
|
^^^^^^^^^
|
|
|
|
Custom data 8
|
|
|
|
|
|
|
|
CX2341X_ENC_MUTE_VIDEO
|
|
~~~~~~~~~~~~~~~~~~~~~~
|
|
|
|
Enum: 217/0xD9
|
|
|
|
Description
|
|
^^^^^^^^^^^
|
|
|
|
Video muting
|
|
|
|
Param[0]
|
|
^^^^^^^^
|
|
|
|
Bit usage:
|
|
|
|
.. code-block:: none
|
|
|
|
0 '0'=video not muted
|
|
'1'=video muted, creates frames with the YUV color defined below
|
|
1:7 Unused
|
|
8:15 V chrominance information
|
|
16:23 U chrominance information
|
|
24:31 Y luminance information
|
|
|
|
|
|
|
|
CX2341X_ENC_MUTE_AUDIO
|
|
~~~~~~~~~~~~~~~~~~~~~~
|
|
|
|
Enum: 218/0xDA
|
|
|
|
Description
|
|
^^^^^^^^^^^
|
|
|
|
Audio muting
|
|
|
|
Param[0]
|
|
^^^^^^^^
|
|
|
|
- 0=audio not muted
|
|
- 1=audio muted (produces silent mpeg audio stream)
|
|
|
|
|
|
|
|
CX2341X_ENC_SET_VERT_CROP_LINE
|
|
~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~
|
|
|
|
Enum: 219/0xDB
|
|
|
|
Description
|
|
^^^^^^^^^^^
|
|
|
|
Something to do with 'Vertical Crop Line'
|
|
|
|
Param[0]
|
|
^^^^^^^^
|
|
|
|
If saa7114 and raw VBI capture and 60 Hz, then set to 10001.
|
|
Else 0.
|
|
|
|
|
|
|
|
CX2341X_ENC_MISC
|
|
~~~~~~~~~~~~~~~~
|
|
|
|
Enum: 220/0xDC
|
|
|
|
Description
|
|
^^^^^^^^^^^
|
|
|
|
Miscellaneous actions. Not known for 100% what it does. It's really a
|
|
sort of ioctl call. The first parameter is a command number, the second
|
|
the value.
|
|
|
|
Param[0]
|
|
^^^^^^^^
|
|
|
|
Command number:
|
|
|
|
.. code-block:: none
|
|
|
|
1=set initial SCR value when starting encoding (works).
|
|
2=set quality mode (apparently some test setting).
|
|
3=setup advanced VIM protection handling.
|
|
Always 1 for the cx23416 and 0 for cx23415.
|
|
4=generate DVD compatible PTS timestamps
|
|
5=USB flush mode
|
|
6=something to do with the quantization matrix
|
|
7=set navigation pack insertion for DVD: adds 0xbf (private stream 2)
|
|
packets to the MPEG. The size of these packets is 2048 bytes (including
|
|
the header of 6 bytes: 0x000001bf + length). The payload is zeroed and
|
|
it is up to the application to fill them in. These packets are apparently
|
|
inserted every four frames.
|
|
8=enable scene change detection (seems to be a failure)
|
|
9=set history parameters of the video input module
|
|
10=set input field order of VIM
|
|
11=set quantization matrix
|
|
12=reset audio interface after channel change or input switch (has no argument).
|
|
Needed for the cx2584x, not needed for the mspx4xx, but it doesn't seem to
|
|
do any harm calling it regardless.
|
|
13=set audio volume delay
|
|
14=set audio delay
|
|
|
|
|
|
Param[1]
|
|
^^^^^^^^
|
|
|
|
Command value.
|
|
|
|
Decoder firmware API description
|
|
--------------------------------
|
|
|
|
.. note:: this API is part of the decoder firmware, so it's cx23415 only.
|
|
|
|
|
|
|
|
CX2341X_DEC_PING_FW
|
|
~~~~~~~~~~~~~~~~~~~
|
|
|
|
Enum: 0/0x00
|
|
|
|
Description
|
|
^^^^^^^^^^^
|
|
|
|
This API call does nothing. It may be used to check if the firmware
|
|
is responding.
|
|
|
|
|
|
|
|
CX2341X_DEC_START_PLAYBACK
|
|
~~~~~~~~~~~~~~~~~~~~~~~~~~
|
|
|
|
Enum: 1/0x01
|
|
|
|
Description
|
|
^^^^^^^^^^^
|
|
|
|
Begin or resume playback.
|
|
|
|
Param[0]
|
|
^^^^^^^^
|
|
|
|
0 based frame number in GOP to begin playback from.
|
|
|
|
Param[1]
|
|
^^^^^^^^
|
|
|
|
Specifies the number of muted audio frames to play before normal
|
|
audio resumes. (This is not implemented in the firmware, leave at 0)
|
|
|
|
|
|
|
|
CX2341X_DEC_STOP_PLAYBACK
|
|
~~~~~~~~~~~~~~~~~~~~~~~~~
|
|
|
|
Enum: 2/0x02
|
|
|
|
Description
|
|
^^^^^^^^^^^
|
|
|
|
Ends playback and clears all decoder buffers. If PTS is not zero,
|
|
playback stops at specified PTS.
|
|
|
|
Param[0]
|
|
^^^^^^^^
|
|
|
|
Display 0=last frame, 1=black
|
|
|
|
.. note::
|
|
|
|
this takes effect immediately, so if you want to wait for a PTS,
|
|
then use '0', otherwise the screen goes to black at once.
|
|
You can call this later (even if there is no playback) with a 1 value
|
|
to set the screen to black.
|
|
|
|
Param[1]
|
|
^^^^^^^^
|
|
|
|
PTS low
|
|
|
|
Param[2]
|
|
^^^^^^^^
|
|
|
|
PTS high
|
|
|
|
|
|
|
|
CX2341X_DEC_SET_PLAYBACK_SPEED
|
|
~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~
|
|
|
|
Enum: 3/0x03
|
|
|
|
Description
|
|
^^^^^^^^^^^
|
|
|
|
Playback stream at speed other than normal. There are two modes of
|
|
operation:
|
|
|
|
- Smooth: host transfers entire stream and firmware drops unused
|
|
frames.
|
|
- Coarse: host drops frames based on indexing as required to achieve
|
|
desired speed.
|
|
|
|
Param[0]
|
|
^^^^^^^^
|
|
|
|
.. code-block:: none
|
|
|
|
Bitmap:
|
|
0:7 0 normal
|
|
1 fast only "1.5 times"
|
|
n nX fast, 1/nX slow
|
|
30 Framedrop:
|
|
'0' during 1.5 times play, every other B frame is dropped
|
|
'1' during 1.5 times play, stream is unchanged (bitrate
|
|
must not exceed 8mbps)
|
|
31 Speed:
|
|
'0' slow
|
|
'1' fast
|
|
|
|
.. note::
|
|
|
|
n is limited to 2. Anything higher does not result in
|
|
faster playback. Instead the host should start dropping frames.
|
|
|
|
Param[1]
|
|
^^^^^^^^
|
|
|
|
Direction: 0=forward, 1=reverse
|
|
|
|
.. note::
|
|
|
|
to make reverse playback work you have to write full GOPs in
|
|
reverse order.
|
|
|
|
Param[2]
|
|
^^^^^^^^
|
|
|
|
.. code-block:: none
|
|
|
|
Picture mask:
|
|
1=I frames
|
|
3=I, P frames
|
|
7=I, P, B frames
|
|
|
|
Param[3]
|
|
^^^^^^^^
|
|
|
|
B frames per GOP (for reverse play only)
|
|
|
|
.. note::
|
|
|
|
for reverse playback the Picture Mask should be set to I or I, P.
|
|
Adding B frames to the mask will result in corrupt video. This field
|
|
has to be set to the correct value in order to keep the timing correct.
|
|
|
|
Param[4]
|
|
^^^^^^^^
|
|
|
|
Mute audio: 0=disable, 1=enable
|
|
|
|
Param[5]
|
|
^^^^^^^^
|
|
|
|
Display 0=frame, 1=field
|
|
|
|
Param[6]
|
|
^^^^^^^^
|
|
|
|
Specifies the number of muted audio frames to play before normal audio
|
|
resumes. (Not implemented in the firmware, leave at 0)
|
|
|
|
|
|
|
|
CX2341X_DEC_STEP_VIDEO
|
|
~~~~~~~~~~~~~~~~~~~~~~
|
|
|
|
Enum: 5/0x05
|
|
|
|
Description
|
|
^^^^^^^^^^^
|
|
|
|
Each call to this API steps the playback to the next unit defined below
|
|
in the current playback direction.
|
|
|
|
Param[0]
|
|
^^^^^^^^
|
|
|
|
0=frame, 1=top field, 2=bottom field
|
|
|
|
|
|
|
|
CX2341X_DEC_SET_DMA_BLOCK_SIZE
|
|
~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~
|
|
|
|
Enum: 8/0x08
|
|
|
|
Description
|
|
^^^^^^^^^^^
|
|
|
|
Set DMA transfer block size. Counterpart to API 0xC9
|
|
|
|
Param[0]
|
|
^^^^^^^^
|
|
|
|
DMA transfer block size in bytes. A different size may be specified
|
|
when issuing the DMA transfer command.
|
|
|
|
|
|
|
|
CX2341X_DEC_GET_XFER_INFO
|
|
~~~~~~~~~~~~~~~~~~~~~~~~~
|
|
|
|
Enum: 9/0x09
|
|
|
|
Description
|
|
^^^^^^^^^^^
|
|
|
|
This API call may be used to detect an end of stream condition.
|
|
|
|
Result[0]
|
|
^^^^^^^^^
|
|
|
|
Stream type
|
|
|
|
Result[1]
|
|
^^^^^^^^^
|
|
|
|
Address offset
|
|
|
|
Result[2]
|
|
^^^^^^^^^
|
|
|
|
Maximum bytes to transfer
|
|
|
|
Result[3]
|
|
^^^^^^^^^
|
|
|
|
Buffer fullness
|
|
|
|
|
|
|
|
CX2341X_DEC_GET_DMA_STATUS
|
|
~~~~~~~~~~~~~~~~~~~~~~~~~~
|
|
|
|
Enum: 10/0x0A
|
|
|
|
Description
|
|
^^^^^^^^^^^
|
|
|
|
Status of the last DMA transfer
|
|
|
|
Result[0]
|
|
^^^^^^^^^
|
|
|
|
Bit 1 set means transfer complete
|
|
Bit 2 set means DMA error
|
|
Bit 3 set means linked list error
|
|
|
|
Result[1]
|
|
^^^^^^^^^
|
|
|
|
DMA type: 0=MPEG, 1=OSD, 2=YUV
|
|
|
|
|
|
|
|
CX2341X_DEC_SCHED_DMA_FROM_HOST
|
|
~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~
|
|
|
|
Enum: 11/0x0B
|
|
|
|
Description
|
|
^^^^^^^^^^^
|
|
|
|
Setup DMA from host operation. Counterpart to API 0xCC
|
|
|
|
Param[0]
|
|
^^^^^^^^
|
|
|
|
Memory address of link list
|
|
|
|
Param[1]
|
|
^^^^^^^^
|
|
|
|
Total # of bytes to transfer
|
|
|
|
Param[2]
|
|
^^^^^^^^
|
|
|
|
DMA type (0=MPEG, 1=OSD, 2=YUV)
|
|
|
|
|
|
|
|
CX2341X_DEC_PAUSE_PLAYBACK
|
|
~~~~~~~~~~~~~~~~~~~~~~~~~~
|
|
|
|
Enum: 13/0x0D
|
|
|
|
Description
|
|
^^^^^^^^^^^
|
|
|
|
Freeze playback immediately. In this mode, when internal buffers are
|
|
full, no more data will be accepted and data request IRQs will be
|
|
masked.
|
|
|
|
Param[0]
|
|
^^^^^^^^
|
|
|
|
Display: 0=last frame, 1=black
|
|
|
|
|
|
|
|
CX2341X_DEC_HALT_FW
|
|
~~~~~~~~~~~~~~~~~~~
|
|
|
|
Enum: 14/0x0E
|
|
|
|
Description
|
|
^^^^^^^^^^^
|
|
|
|
The firmware is halted and no further API calls are serviced until
|
|
the firmware is uploaded again.
|
|
|
|
|
|
|
|
CX2341X_DEC_SET_STANDARD
|
|
~~~~~~~~~~~~~~~~~~~~~~~~
|
|
|
|
Enum: 16/0x10
|
|
|
|
Description
|
|
^^^^^^^^^^^
|
|
|
|
Selects display standard
|
|
|
|
Param[0]
|
|
^^^^^^^^
|
|
|
|
0=NTSC, 1=PAL
|
|
|
|
|
|
|
|
CX2341X_DEC_GET_VERSION
|
|
~~~~~~~~~~~~~~~~~~~~~~~
|
|
|
|
Enum: 17/0x11
|
|
|
|
Description
|
|
^^^^^^^^^^^
|
|
|
|
Returns decoder firmware version information
|
|
|
|
Result[0]
|
|
^^^^^^^^^
|
|
|
|
Version bitmask:
|
|
- Bits 0:15 build
|
|
- Bits 16:23 minor
|
|
- Bits 24:31 major
|
|
|
|
|
|
|
|
CX2341X_DEC_SET_STREAM_INPUT
|
|
~~~~~~~~~~~~~~~~~~~~~~~~~~~~
|
|
|
|
Enum: 20/0x14
|
|
|
|
Description
|
|
^^^^^^^^^^^
|
|
|
|
Select decoder stream input port
|
|
|
|
Param[0]
|
|
^^^^^^^^
|
|
|
|
0=memory (default), 1=streaming
|
|
|
|
|
|
|
|
CX2341X_DEC_GET_TIMING_INFO
|
|
~~~~~~~~~~~~~~~~~~~~~~~~~~~
|
|
|
|
Enum: 21/0x15
|
|
|
|
Description
|
|
^^^^^^^^^^^
|
|
|
|
Returns timing information from start of playback
|
|
|
|
Result[0]
|
|
^^^^^^^^^
|
|
|
|
Frame count by decode order
|
|
|
|
Result[1]
|
|
^^^^^^^^^
|
|
|
|
Video PTS bits 0:31 by display order
|
|
|
|
Result[2]
|
|
^^^^^^^^^
|
|
|
|
Video PTS bit 32 by display order
|
|
|
|
Result[3]
|
|
^^^^^^^^^
|
|
|
|
SCR bits 0:31 by display order
|
|
|
|
Result[4]
|
|
^^^^^^^^^
|
|
|
|
SCR bit 32 by display order
|
|
|
|
|
|
|
|
CX2341X_DEC_SET_AUDIO_MODE
|
|
~~~~~~~~~~~~~~~~~~~~~~~~~~
|
|
|
|
Enum: 22/0x16
|
|
|
|
Description
|
|
^^^^^^^^^^^
|
|
|
|
Select audio mode
|
|
|
|
Param[0]
|
|
^^^^^^^^
|
|
|
|
Dual mono mode action
|
|
0=Stereo, 1=Left, 2=Right, 3=Mono, 4=Swap, -1=Unchanged
|
|
|
|
Param[1]
|
|
^^^^^^^^
|
|
|
|
Stereo mode action:
|
|
0=Stereo, 1=Left, 2=Right, 3=Mono, 4=Swap, -1=Unchanged
|
|
|
|
|
|
|
|
CX2341X_DEC_SET_EVENT_NOTIFICATION
|
|
~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~
|
|
|
|
Enum: 23/0x17
|
|
|
|
Description
|
|
^^^^^^^^^^^
|
|
|
|
Setup firmware to notify the host about a particular event.
|
|
Counterpart to API 0xD5
|
|
|
|
Param[0]
|
|
^^^^^^^^
|
|
|
|
Event:
|
|
- 0=Audio mode change between mono, (joint) stereo and dual channel.
|
|
- 3=Decoder started
|
|
- 4=Unknown: goes off 10-15 times per second while decoding.
|
|
- 5=Some sync event: goes off once per frame.
|
|
|
|
Param[1]
|
|
^^^^^^^^
|
|
|
|
Notification 0=disabled, 1=enabled
|
|
|
|
Param[2]
|
|
^^^^^^^^
|
|
|
|
Interrupt bit
|
|
|
|
Param[3]
|
|
^^^^^^^^
|
|
|
|
Mailbox slot, -1 if no mailbox required.
|
|
|
|
|
|
|
|
CX2341X_DEC_SET_DISPLAY_BUFFERS
|
|
~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~
|
|
|
|
Enum: 24/0x18
|
|
|
|
Description
|
|
^^^^^^^^^^^
|
|
|
|
Number of display buffers. To decode all frames in reverse playback you
|
|
must use nine buffers.
|
|
|
|
Param[0]
|
|
^^^^^^^^
|
|
|
|
0=six buffers, 1=nine buffers
|
|
|
|
|
|
|
|
CX2341X_DEC_EXTRACT_VBI
|
|
~~~~~~~~~~~~~~~~~~~~~~~
|
|
|
|
Enum: 25/0x19
|
|
|
|
Description
|
|
^^^^^^^^^^^
|
|
|
|
Extracts VBI data
|
|
|
|
Param[0]
|
|
^^^^^^^^
|
|
|
|
0=extract from extension & user data, 1=extract from private packets
|
|
|
|
Result[0]
|
|
^^^^^^^^^
|
|
|
|
VBI table location
|
|
|
|
Result[1]
|
|
^^^^^^^^^
|
|
|
|
VBI table size
|
|
|
|
|
|
|
|
CX2341X_DEC_SET_DECODER_SOURCE
|
|
~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~
|
|
|
|
Enum: 26/0x1A
|
|
|
|
Description
|
|
^^^^^^^^^^^
|
|
|
|
Selects decoder source. Ensure that the parameters passed to this
|
|
API match the encoder settings.
|
|
|
|
Param[0]
|
|
^^^^^^^^
|
|
|
|
Mode: 0=MPEG from host, 1=YUV from encoder, 2=YUV from host
|
|
|
|
Param[1]
|
|
^^^^^^^^
|
|
|
|
YUV picture width
|
|
|
|
Param[2]
|
|
^^^^^^^^
|
|
|
|
YUV picture height
|
|
|
|
Param[3]
|
|
^^^^^^^^
|
|
|
|
Bitmap: see Param[0] of API 0xBD
|
|
|
|
|
|
|
|
CX2341X_DEC_SET_PREBUFFERING
|
|
~~~~~~~~~~~~~~~~~~~~~~~~~~~~
|
|
|
|
Enum: 30/0x1E
|
|
|
|
Description
|
|
^^^^^^^^^^^
|
|
|
|
Decoder prebuffering, when enabled up to 128KB are buffered for
|
|
streams <8mpbs or 640KB for streams >8mbps
|
|
|
|
Param[0]
|
|
^^^^^^^^
|
|
|
|
0=off, 1=on
|
|
|
|
PVR350 Video decoder registers 0x02002800 -> 0x02002B00
|
|
-------------------------------------------------------
|
|
|
|
Author: Ian Armstrong <ian@iarmst.demon.co.uk>
|
|
|
|
Version: v0.4
|
|
|
|
Date: 12 March 2007
|
|
|
|
|
|
This list has been worked out through trial and error. There will be mistakes
|
|
and omissions. Some registers have no obvious effect so it's hard to say what
|
|
they do, while others interact with each other, or require a certain load
|
|
sequence. Horizontal filter setup is one example, with six registers working
|
|
in unison and requiring a certain load sequence to correctly configure. The
|
|
indexed colour palette is much easier to set at just two registers, but again
|
|
it requires a certain load sequence.
|
|
|
|
Some registers are fussy about what they are set to. Load in a bad value & the
|
|
decoder will fail. A firmware reload will often recover, but sometimes a reset
|
|
is required. For registers containing size information, setting them to 0 is
|
|
generally a bad idea. For other control registers i.e. 2878, you'll only find
|
|
out what values are bad when it hangs.
|
|
|
|
.. code-block:: none
|
|
|
|
--------------------------------------------------------------------------------
|
|
2800
|
|
bit 0
|
|
Decoder enable
|
|
0 = disable
|
|
1 = enable
|
|
--------------------------------------------------------------------------------
|
|
2804
|
|
bits 0:31
|
|
Decoder horizontal Y alias register 1
|
|
---------------
|
|
2808
|
|
bits 0:31
|
|
Decoder horizontal Y alias register 2
|
|
---------------
|
|
280C
|
|
bits 0:31
|
|
Decoder horizontal Y alias register 3
|
|
---------------
|
|
2810
|
|
bits 0:31
|
|
Decoder horizontal Y alias register 4
|
|
---------------
|
|
2814
|
|
bits 0:31
|
|
Decoder horizontal Y alias register 5
|
|
---------------
|
|
2818
|
|
bits 0:31
|
|
Decoder horizontal Y alias trigger
|
|
|
|
These six registers control the horizontal aliasing filter for the Y plane.
|
|
The first five registers must all be loaded before accessing the trigger
|
|
(2818), as this register actually clocks the data through for the first
|
|
five.
|
|
|
|
To correctly program set the filter, this whole procedure must be done 16
|
|
times. The actual register contents are copied from a lookup-table in the
|
|
firmware which contains 4 different filter settings.
|
|
|
|
--------------------------------------------------------------------------------
|
|
281C
|
|
bits 0:31
|
|
Decoder horizontal UV alias register 1
|
|
---------------
|
|
2820
|
|
bits 0:31
|
|
Decoder horizontal UV alias register 2
|
|
---------------
|
|
2824
|
|
bits 0:31
|
|
Decoder horizontal UV alias register 3
|
|
---------------
|
|
2828
|
|
bits 0:31
|
|
Decoder horizontal UV alias register 4
|
|
---------------
|
|
282C
|
|
bits 0:31
|
|
Decoder horizontal UV alias register 5
|
|
---------------
|
|
2830
|
|
bits 0:31
|
|
Decoder horizontal UV alias trigger
|
|
|
|
These six registers control the horizontal aliasing for the UV plane.
|
|
Operation is the same as the Y filter, with 2830 being the trigger
|
|
register.
|
|
|
|
--------------------------------------------------------------------------------
|
|
2834
|
|
bits 0:15
|
|
Decoder Y source width in pixels
|
|
|
|
bits 16:31
|
|
Decoder Y destination width in pixels
|
|
---------------
|
|
2838
|
|
bits 0:15
|
|
Decoder UV source width in pixels
|
|
|
|
bits 16:31
|
|
Decoder UV destination width in pixels
|
|
|
|
NOTE: For both registers, the resulting image must be fully visible on
|
|
screen. If the image exceeds the right edge both the source and destination
|
|
size must be adjusted to reflect the visible portion. For the source width,
|
|
you must take into account the scaling when calculating the new value.
|
|
--------------------------------------------------------------------------------
|
|
|
|
283C
|
|
bits 0:31
|
|
Decoder Y horizontal scaling
|
|
Normally = Reg 2854 >> 2
|
|
---------------
|
|
2840
|
|
bits 0:31
|
|
Decoder ?? unknown - horizontal scaling
|
|
Usually 0x00080514
|
|
---------------
|
|
2844
|
|
bits 0:31
|
|
Decoder UV horizontal scaling
|
|
Normally = Reg 2854 >> 2
|
|
---------------
|
|
2848
|
|
bits 0:31
|
|
Decoder ?? unknown - horizontal scaling
|
|
Usually 0x00100514
|
|
---------------
|
|
284C
|
|
bits 0:31
|
|
Decoder ?? unknown - Y plane
|
|
Usually 0x00200020
|
|
---------------
|
|
2850
|
|
bits 0:31
|
|
Decoder ?? unknown - UV plane
|
|
Usually 0x00200020
|
|
---------------
|
|
2854
|
|
bits 0:31
|
|
Decoder 'master' value for horizontal scaling
|
|
---------------
|
|
2858
|
|
bits 0:31
|
|
Decoder ?? unknown
|
|
Usually 0
|
|
---------------
|
|
285C
|
|
bits 0:31
|
|
Decoder ?? unknown
|
|
Normally = Reg 2854 >> 1
|
|
---------------
|
|
2860
|
|
bits 0:31
|
|
Decoder ?? unknown
|
|
Usually 0
|
|
---------------
|
|
2864
|
|
bits 0:31
|
|
Decoder ?? unknown
|
|
Normally = Reg 2854 >> 1
|
|
---------------
|
|
2868
|
|
bits 0:31
|
|
Decoder ?? unknown
|
|
Usually 0
|
|
|
|
Most of these registers either control horizontal scaling, or appear linked
|
|
to it in some way. Register 2854 contains the 'master' value & the other
|
|
registers can be calculated from that one. You must also remember to
|
|
correctly set the divider in Reg 2874.
|
|
|
|
To enlarge:
|
|
Reg 2854 = (source_width * 0x00200000) / destination_width
|
|
Reg 2874 = No divide
|
|
|
|
To reduce from full size down to half size:
|
|
Reg 2854 = (source_width/2 * 0x00200000) / destination width
|
|
Reg 2874 = Divide by 2
|
|
|
|
To reduce from half size down to quarter size:
|
|
Reg 2854 = (source_width/4 * 0x00200000) / destination width
|
|
Reg 2874 = Divide by 4
|
|
|
|
The result is always rounded up.
|
|
|
|
--------------------------------------------------------------------------------
|
|
286C
|
|
bits 0:15
|
|
Decoder horizontal Y buffer offset
|
|
|
|
bits 15:31
|
|
Decoder horizontal UV buffer offset
|
|
|
|
Offset into the video image buffer. If the offset is gradually incremented,
|
|
the on screen image will move left & wrap around higher up on the right.
|
|
|
|
--------------------------------------------------------------------------------
|
|
2870
|
|
bits 0:15
|
|
Decoder horizontal Y output offset
|
|
|
|
bits 16:31
|
|
Decoder horizontal UV output offset
|
|
|
|
Offsets the actual video output. Controls output alignment of the Y & UV
|
|
planes. The higher the value, the greater the shift to the left. Use
|
|
reg 2890 to move the image right.
|
|
|
|
--------------------------------------------------------------------------------
|
|
2874
|
|
bits 0:1
|
|
Decoder horizontal Y output size divider
|
|
00 = No divide
|
|
01 = Divide by 2
|
|
10 = Divide by 3
|
|
|
|
bits 4:5
|
|
Decoder horizontal UV output size divider
|
|
00 = No divide
|
|
01 = Divide by 2
|
|
10 = Divide by 3
|
|
|
|
bit 8
|
|
Decoder ?? unknown
|
|
0 = Normal
|
|
1 = Affects video output levels
|
|
|
|
bit 16
|
|
Decoder ?? unknown
|
|
0 = Normal
|
|
1 = Disable horizontal filter
|
|
|
|
--------------------------------------------------------------------------------
|
|
2878
|
|
bit 0
|
|
?? unknown
|
|
|
|
bit 1
|
|
osd on/off
|
|
0 = osd off
|
|
1 = osd on
|
|
|
|
bit 2
|
|
Decoder + osd video timing
|
|
0 = NTSC
|
|
1 = PAL
|
|
|
|
bits 3:4
|
|
?? unknown
|
|
|
|
bit 5
|
|
Decoder + osd
|
|
Swaps upper & lower fields
|
|
|
|
--------------------------------------------------------------------------------
|
|
287C
|
|
bits 0:10
|
|
Decoder & osd ?? unknown
|
|
Moves entire screen horizontally. Starts at 0x005 with the screen
|
|
shifted heavily to the right. Incrementing in steps of 0x004 will
|
|
gradually shift the screen to the left.
|
|
|
|
bits 11:31
|
|
?? unknown
|
|
|
|
Normally contents are 0x00101111 (NTSC) or 0x1010111d (PAL)
|
|
|
|
--------------------------------------------------------------------------------
|
|
2880 -------- ?? unknown
|
|
2884 -------- ?? unknown
|
|
--------------------------------------------------------------------------------
|
|
2888
|
|
bit 0
|
|
Decoder + osd ?? unknown
|
|
0 = Normal
|
|
1 = Misaligned fields (Correctable through 289C & 28A4)
|
|
|
|
bit 4
|
|
?? unknown
|
|
|
|
bit 8
|
|
?? unknown
|
|
|
|
Warning: Bad values will require a firmware reload to recover.
|
|
Known to be bad are 0x000,0x011,0x100,0x111
|
|
--------------------------------------------------------------------------------
|
|
288C
|
|
bits 0:15
|
|
osd ?? unknown
|
|
Appears to affect the osd position stability. The higher the value the
|
|
more unstable it becomes. Decoder output remains stable.
|
|
|
|
bits 16:31
|
|
osd ?? unknown
|
|
Same as bits 0:15
|
|
|
|
--------------------------------------------------------------------------------
|
|
2890
|
|
bits 0:11
|
|
Decoder output horizontal offset.
|
|
|
|
Horizontal offset moves the video image right. A small left shift is
|
|
possible, but it's better to use reg 2870 for that due to its greater
|
|
range.
|
|
|
|
NOTE: Video corruption will occur if video window is shifted off the right
|
|
edge. To avoid this read the notes for 2834 & 2838.
|
|
--------------------------------------------------------------------------------
|
|
2894
|
|
bits 0:23
|
|
Decoder output video surround colour.
|
|
|
|
Contains the colour (in yuv) used to fill the screen when the video is
|
|
running in a window.
|
|
--------------------------------------------------------------------------------
|
|
2898
|
|
bits 0:23
|
|
Decoder video window colour
|
|
Contains the colour (in yuv) used to fill the video window when the
|
|
video is turned off.
|
|
|
|
bit 24
|
|
Decoder video output
|
|
0 = Video on
|
|
1 = Video off
|
|
|
|
bit 28
|
|
Decoder plane order
|
|
0 = Y,UV
|
|
1 = UV,Y
|
|
|
|
bit 29
|
|
Decoder second plane byte order
|
|
0 = Normal (UV)
|
|
1 = Swapped (VU)
|
|
|
|
In normal usage, the first plane is Y & the second plane is UV. Though the
|
|
order of the planes can be swapped, only the byte order of the second plane
|
|
can be swapped. This isn't much use for the Y plane, but can be useful for
|
|
the UV plane.
|
|
|
|
--------------------------------------------------------------------------------
|
|
289C
|
|
bits 0:15
|
|
Decoder vertical field offset 1
|
|
|
|
bits 16:31
|
|
Decoder vertical field offset 2
|
|
|
|
Controls field output vertical alignment. The higher the number, the lower
|
|
the image on screen. Known starting values are 0x011E0017 (NTSC) &
|
|
0x01500017 (PAL)
|
|
--------------------------------------------------------------------------------
|
|
28A0
|
|
bits 0:15
|
|
Decoder & osd width in pixels
|
|
|
|
bits 16:31
|
|
Decoder & osd height in pixels
|
|
|
|
All output from the decoder & osd are disabled beyond this area. Decoder
|
|
output will simply go black outside of this region. If the osd tries to
|
|
exceed this area it will become corrupt.
|
|
--------------------------------------------------------------------------------
|
|
28A4
|
|
bits 0:11
|
|
osd left shift.
|
|
|
|
Has a range of 0x770->0x7FF. With the exception of 0, any value outside of
|
|
this range corrupts the osd.
|
|
--------------------------------------------------------------------------------
|
|
28A8
|
|
bits 0:15
|
|
osd vertical field offset 1
|
|
|
|
bits 16:31
|
|
osd vertical field offset 2
|
|
|
|
Controls field output vertical alignment. The higher the number, the lower
|
|
the image on screen. Known starting values are 0x011E0017 (NTSC) &
|
|
0x01500017 (PAL)
|
|
--------------------------------------------------------------------------------
|
|
28AC -------- ?? unknown
|
|
|
|
|
V
|
|
28BC -------- ?? unknown
|
|
--------------------------------------------------------------------------------
|
|
28C0
|
|
bit 0
|
|
Current output field
|
|
0 = first field
|
|
1 = second field
|
|
|
|
bits 16:31
|
|
Current scanline
|
|
The scanline counts from the top line of the first field
|
|
through to the last line of the second field.
|
|
--------------------------------------------------------------------------------
|
|
28C4 -------- ?? unknown
|
|
|
|
|
V
|
|
28F8 -------- ?? unknown
|
|
--------------------------------------------------------------------------------
|
|
28FC
|
|
bit 0
|
|
?? unknown
|
|
0 = Normal
|
|
1 = Breaks decoder & osd output
|
|
--------------------------------------------------------------------------------
|
|
2900
|
|
bits 0:31
|
|
Decoder vertical Y alias register 1
|
|
---------------
|
|
2904
|
|
bits 0:31
|
|
Decoder vertical Y alias register 2
|
|
---------------
|
|
2908
|
|
bits 0:31
|
|
Decoder vertical Y alias trigger
|
|
|
|
These three registers control the vertical aliasing filter for the Y plane.
|
|
Operation is similar to the horizontal Y filter (2804). The only real
|
|
difference is that there are only two registers to set before accessing
|
|
the trigger register (2908). As for the horizontal filter, the values are
|
|
taken from a lookup table in the firmware, and the procedure must be
|
|
repeated 16 times to fully program the filter.
|
|
--------------------------------------------------------------------------------
|
|
290C
|
|
bits 0:31
|
|
Decoder vertical UV alias register 1
|
|
---------------
|
|
2910
|
|
bits 0:31
|
|
Decoder vertical UV alias register 2
|
|
---------------
|
|
2914
|
|
bits 0:31
|
|
Decoder vertical UV alias trigger
|
|
|
|
These three registers control the vertical aliasing filter for the UV
|
|
plane. Operation is the same as the Y filter, with 2914 being the trigger.
|
|
--------------------------------------------------------------------------------
|
|
2918
|
|
bits 0:15
|
|
Decoder Y source height in pixels
|
|
|
|
bits 16:31
|
|
Decoder Y destination height in pixels
|
|
---------------
|
|
291C
|
|
bits 0:15
|
|
Decoder UV source height in pixels divided by 2
|
|
|
|
bits 16:31
|
|
Decoder UV destination height in pixels
|
|
|
|
NOTE: For both registers, the resulting image must be fully visible on
|
|
screen. If the image exceeds the bottom edge both the source and
|
|
destination size must be adjusted to reflect the visible portion. For the
|
|
source height, you must take into account the scaling when calculating the
|
|
new value.
|
|
--------------------------------------------------------------------------------
|
|
2920
|
|
bits 0:31
|
|
Decoder Y vertical scaling
|
|
Normally = Reg 2930 >> 2
|
|
---------------
|
|
2924
|
|
bits 0:31
|
|
Decoder Y vertical scaling
|
|
Normally = Reg 2920 + 0x514
|
|
---------------
|
|
2928
|
|
bits 0:31
|
|
Decoder UV vertical scaling
|
|
When enlarging = Reg 2930 >> 2
|
|
When reducing = Reg 2930 >> 3
|
|
---------------
|
|
292C
|
|
bits 0:31
|
|
Decoder UV vertical scaling
|
|
Normally = Reg 2928 + 0x514
|
|
---------------
|
|
2930
|
|
bits 0:31
|
|
Decoder 'master' value for vertical scaling
|
|
---------------
|
|
2934
|
|
bits 0:31
|
|
Decoder ?? unknown - Y vertical scaling
|
|
---------------
|
|
2938
|
|
bits 0:31
|
|
Decoder Y vertical scaling
|
|
Normally = Reg 2930
|
|
---------------
|
|
293C
|
|
bits 0:31
|
|
Decoder ?? unknown - Y vertical scaling
|
|
---------------
|
|
2940
|
|
bits 0:31
|
|
Decoder UV vertical scaling
|
|
When enlarging = Reg 2930 >> 1
|
|
When reducing = Reg 2930
|
|
---------------
|
|
2944
|
|
bits 0:31
|
|
Decoder ?? unknown - UV vertical scaling
|
|
---------------
|
|
2948
|
|
bits 0:31
|
|
Decoder UV vertical scaling
|
|
Normally = Reg 2940
|
|
---------------
|
|
294C
|
|
bits 0:31
|
|
Decoder ?? unknown - UV vertical scaling
|
|
|
|
Most of these registers either control vertical scaling, or appear linked
|
|
to it in some way. Register 2930 contains the 'master' value & all other
|
|
registers can be calculated from that one. You must also remember to
|
|
correctly set the divider in Reg 296C
|
|
|
|
To enlarge:
|
|
Reg 2930 = (source_height * 0x00200000) / destination_height
|
|
Reg 296C = No divide
|
|
|
|
To reduce from full size down to half size:
|
|
Reg 2930 = (source_height/2 * 0x00200000) / destination height
|
|
Reg 296C = Divide by 2
|
|
|
|
To reduce from half down to quarter.
|
|
Reg 2930 = (source_height/4 * 0x00200000) / destination height
|
|
Reg 296C = Divide by 4
|
|
|
|
--------------------------------------------------------------------------------
|
|
2950
|
|
bits 0:15
|
|
Decoder Y line index into display buffer, first field
|
|
|
|
bits 16:31
|
|
Decoder Y vertical line skip, first field
|
|
--------------------------------------------------------------------------------
|
|
2954
|
|
bits 0:15
|
|
Decoder Y line index into display buffer, second field
|
|
|
|
bits 16:31
|
|
Decoder Y vertical line skip, second field
|
|
--------------------------------------------------------------------------------
|
|
2958
|
|
bits 0:15
|
|
Decoder UV line index into display buffer, first field
|
|
|
|
bits 16:31
|
|
Decoder UV vertical line skip, first field
|
|
--------------------------------------------------------------------------------
|
|
295C
|
|
bits 0:15
|
|
Decoder UV line index into display buffer, second field
|
|
|
|
bits 16:31
|
|
Decoder UV vertical line skip, second field
|
|
--------------------------------------------------------------------------------
|
|
2960
|
|
bits 0:15
|
|
Decoder destination height minus 1
|
|
|
|
bits 16:31
|
|
Decoder destination height divided by 2
|
|
--------------------------------------------------------------------------------
|
|
2964
|
|
bits 0:15
|
|
Decoder Y vertical offset, second field
|
|
|
|
bits 16:31
|
|
Decoder Y vertical offset, first field
|
|
|
|
These two registers shift the Y plane up. The higher the number, the
|
|
greater the shift.
|
|
--------------------------------------------------------------------------------
|
|
2968
|
|
bits 0:15
|
|
Decoder UV vertical offset, second field
|
|
|
|
bits 16:31
|
|
Decoder UV vertical offset, first field
|
|
|
|
These two registers shift the UV plane up. The higher the number, the
|
|
greater the shift.
|
|
--------------------------------------------------------------------------------
|
|
296C
|
|
bits 0:1
|
|
Decoder vertical Y output size divider
|
|
00 = No divide
|
|
01 = Divide by 2
|
|
10 = Divide by 4
|
|
|
|
bits 8:9
|
|
Decoder vertical UV output size divider
|
|
00 = No divide
|
|
01 = Divide by 2
|
|
10 = Divide by 4
|
|
--------------------------------------------------------------------------------
|
|
2970
|
|
bit 0
|
|
Decoder ?? unknown
|
|
0 = Normal
|
|
1 = Affect video output levels
|
|
|
|
bit 16
|
|
Decoder ?? unknown
|
|
0 = Normal
|
|
1 = Disable vertical filter
|
|
|
|
--------------------------------------------------------------------------------
|
|
2974 -------- ?? unknown
|
|
|
|
|
V
|
|
29EF -------- ?? unknown
|
|
--------------------------------------------------------------------------------
|
|
2A00
|
|
bits 0:2
|
|
osd colour mode
|
|
000 = 8 bit indexed
|
|
001 = 16 bit (565)
|
|
010 = 15 bit (555)
|
|
011 = 12 bit (444)
|
|
100 = 32 bit (8888)
|
|
|
|
bits 4:5
|
|
osd display bpp
|
|
01 = 8 bit
|
|
10 = 16 bit
|
|
11 = 32 bit
|
|
|
|
bit 8
|
|
osd global alpha
|
|
0 = Off
|
|
1 = On
|
|
|
|
bit 9
|
|
osd local alpha
|
|
0 = Off
|
|
1 = On
|
|
|
|
bit 10
|
|
osd colour key
|
|
0 = Off
|
|
1 = On
|
|
|
|
bit 11
|
|
osd ?? unknown
|
|
Must be 1
|
|
|
|
bit 13
|
|
osd colour space
|
|
0 = ARGB
|
|
1 = AYVU
|
|
|
|
bits 16:31
|
|
osd ?? unknown
|
|
Must be 0x001B (some kind of buffer pointer ?)
|
|
|
|
When the bits-per-pixel is set to 8, the colour mode is ignored and
|
|
assumed to be 8 bit indexed. For 16 & 32 bits-per-pixel the colour depth
|
|
is honoured, and when using a colour depth that requires fewer bytes than
|
|
allocated the extra bytes are used as padding. So for a 32 bpp with 8 bit
|
|
index colour, there are 3 padding bytes per pixel. It's also possible to
|
|
select 16bpp with a 32 bit colour mode. This results in the pixel width
|
|
being doubled, but the color key will not work as expected in this mode.
|
|
|
|
Colour key is as it suggests. You designate a colour which will become
|
|
completely transparent. When using 565, 555 or 444 colour modes, the
|
|
colour key is always 16 bits wide. The colour to key on is set in Reg 2A18.
|
|
|
|
Local alpha works differently depending on the colour mode. For 32bpp & 8
|
|
bit indexed, local alpha is a per-pixel 256 step transparency, with 0 being
|
|
transparent and 255 being solid. For the 16bpp modes 555 & 444, the unused
|
|
bit(s) act as a simple transparency switch, with 0 being solid & 1 being
|
|
fully transparent. There is no local alpha support for 16bit 565.
|
|
|
|
Global alpha is a 256 step transparency that applies to the entire osd,
|
|
with 0 being transparent & 255 being solid.
|
|
|
|
It's possible to combine colour key, local alpha & global alpha.
|
|
--------------------------------------------------------------------------------
|
|
2A04
|
|
bits 0:15
|
|
osd x coord for left edge
|
|
|
|
bits 16:31
|
|
osd y coord for top edge
|
|
---------------
|
|
2A08
|
|
bits 0:15
|
|
osd x coord for right edge
|
|
|
|
bits 16:31
|
|
osd y coord for bottom edge
|
|
|
|
For both registers, (0,0) = top left corner of the display area. These
|
|
registers do not control the osd size, only where it's positioned & how
|
|
much is visible. The visible osd area cannot exceed the right edge of the
|
|
display, otherwise the osd will become corrupt. See reg 2A10 for
|
|
setting osd width.
|
|
--------------------------------------------------------------------------------
|
|
2A0C
|
|
bits 0:31
|
|
osd buffer index
|
|
|
|
An index into the osd buffer. Slowly incrementing this moves the osd left,
|
|
wrapping around onto the right edge
|
|
--------------------------------------------------------------------------------
|
|
2A10
|
|
bits 0:11
|
|
osd buffer 32 bit word width
|
|
|
|
Contains the width of the osd measured in 32 bit words. This means that all
|
|
colour modes are restricted to a byte width which is divisible by 4.
|
|
--------------------------------------------------------------------------------
|
|
2A14
|
|
bits 0:15
|
|
osd height in pixels
|
|
|
|
bits 16:32
|
|
osd line index into buffer
|
|
osd will start displaying from this line.
|
|
--------------------------------------------------------------------------------
|
|
2A18
|
|
bits 0:31
|
|
osd colour key
|
|
|
|
Contains the colour value which will be transparent.
|
|
--------------------------------------------------------------------------------
|
|
2A1C
|
|
bits 0:7
|
|
osd global alpha
|
|
|
|
Contains the global alpha value (equiv ivtvfbctl --alpha XX)
|
|
--------------------------------------------------------------------------------
|
|
2A20 -------- ?? unknown
|
|
|
|
|
V
|
|
2A2C -------- ?? unknown
|
|
--------------------------------------------------------------------------------
|
|
2A30
|
|
bits 0:7
|
|
osd colour to change in indexed palette
|
|
---------------
|
|
2A34
|
|
bits 0:31
|
|
osd colour for indexed palette
|
|
|
|
To set the new palette, first load the index of the colour to change into
|
|
2A30, then load the new colour into 2A34. The full palette is 256 colours,
|
|
so the index range is 0x00-0xFF
|
|
--------------------------------------------------------------------------------
|
|
2A38 -------- ?? unknown
|
|
2A3C -------- ?? unknown
|
|
--------------------------------------------------------------------------------
|
|
2A40
|
|
bits 0:31
|
|
osd ?? unknown
|
|
|
|
Affects overall brightness, wrapping around to black
|
|
--------------------------------------------------------------------------------
|
|
2A44
|
|
bits 0:31
|
|
osd ?? unknown
|
|
|
|
Green tint
|
|
--------------------------------------------------------------------------------
|
|
2A48
|
|
bits 0:31
|
|
osd ?? unknown
|
|
|
|
Red tint
|
|
--------------------------------------------------------------------------------
|
|
2A4C
|
|
bits 0:31
|
|
osd ?? unknown
|
|
|
|
Affects overall brightness, wrapping around to black
|
|
--------------------------------------------------------------------------------
|
|
2A50
|
|
bits 0:31
|
|
osd ?? unknown
|
|
|
|
Colour shift
|
|
--------------------------------------------------------------------------------
|
|
2A54
|
|
bits 0:31
|
|
osd ?? unknown
|
|
|
|
Colour shift
|
|
--------------------------------------------------------------------------------
|
|
2A58 -------- ?? unknown
|
|
|
|
|
V
|
|
2AFC -------- ?? unknown
|
|
--------------------------------------------------------------------------------
|
|
2B00
|
|
bit 0
|
|
osd filter control
|
|
0 = filter off
|
|
1 = filter on
|
|
|
|
bits 1:4
|
|
osd ?? unknown
|
|
|
|
--------------------------------------------------------------------------------
|
|
|
|
The cx231xx DMA engine
|
|
----------------------
|
|
|
|
|
|
This page describes the structures and procedures used by the cx2341x DMA
|
|
engine.
|
|
|
|
Introduction
|
|
~~~~~~~~~~~~
|
|
|
|
The cx2341x PCI interface is busmaster capable. This means it has a DMA
|
|
engine to efficiently transfer large volumes of data between the card and main
|
|
memory without requiring help from a CPU. Like most hardware, it must operate
|
|
on contiguous physical memory. This is difficult to come by in large quantities
|
|
on virtual memory machines.
|
|
|
|
Therefore, it also supports a technique called "scatter-gather". The card can
|
|
transfer multiple buffers in one operation. Instead of allocating one large
|
|
contiguous buffer, the driver can allocate several smaller buffers.
|
|
|
|
In practice, I've seen the average transfer to be roughly 80K, but transfers
|
|
above 128K were not uncommon, particularly at startup. The 128K figure is
|
|
important, because that is the largest block that the kernel can normally
|
|
allocate. Even still, 128K blocks are hard to come by, so the driver writer is
|
|
urged to choose a smaller block size and learn the scatter-gather technique.
|
|
|
|
Mailbox #10 is reserved for DMA transfer information.
|
|
|
|
Note: the hardware expects little-endian data ('intel format').
|
|
|
|
Flow
|
|
~~~~
|
|
|
|
This section describes, in general, the order of events when handling DMA
|
|
transfers. Detailed information follows this section.
|
|
|
|
- The card raises the Encoder interrupt.
|
|
- The driver reads the transfer type, offset and size from Mailbox #10.
|
|
- The driver constructs the scatter-gather array from enough free dma buffers
|
|
to cover the size.
|
|
- The driver schedules the DMA transfer via the ScheduleDMAtoHost API call.
|
|
- The card raises the DMA Complete interrupt.
|
|
- The driver checks the DMA status register for any errors.
|
|
- The driver post-processes the newly transferred buffers.
|
|
|
|
NOTE! It is possible that the Encoder and DMA Complete interrupts get raised
|
|
simultaneously. (End of the last, start of the next, etc.)
|
|
|
|
Mailbox #10
|
|
~~~~~~~~~~~
|
|
|
|
The Flags, Command, Return Value and Timeout fields are ignored.
|
|
|
|
- Name: Mailbox #10
|
|
- Results[0]: Type: 0: MPEG.
|
|
- Results[1]: Offset: The position relative to the card's memory space.
|
|
- Results[2]: Size: The exact number of bytes to transfer.
|
|
|
|
My speculation is that since the StartCapture API has a capture type of "RAW"
|
|
available, that the type field will have other values that correspond to YUV
|
|
and PCM data.
|
|
|
|
Scatter-Gather Array
|
|
~~~~~~~~~~~~~~~~~~~~
|
|
|
|
The scatter-gather array is a contiguously allocated block of memory that
|
|
tells the card the source and destination of each data-block to transfer.
|
|
Card "addresses" are derived from the offset supplied by Mailbox #10. Host
|
|
addresses are the physical memory location of the target DMA buffer.
|
|
|
|
Each S-G array element is a struct of three 32-bit words. The first word is
|
|
the source address, the second is the destination address. Both take up the
|
|
entire 32 bits. The lowest 18 bits of the third word is the transfer byte
|
|
count. The high-bit of the third word is the "last" flag. The last-flag tells
|
|
the card to raise the DMA_DONE interrupt. From hard personal experience, if
|
|
you forget to set this bit, the card will still "work" but the stream will
|
|
most likely get corrupted.
|
|
|
|
The transfer count must be a multiple of 256. Therefore, the driver will need
|
|
to track how much data in the target buffer is valid and deal with it
|
|
accordingly.
|
|
|
|
Array Element:
|
|
|
|
- 32-bit Source Address
|
|
- 32-bit Destination Address
|
|
- 14-bit reserved (high bit is the last flag)
|
|
- 18-bit byte count
|
|
|
|
DMA Transfer Status
|
|
~~~~~~~~~~~~~~~~~~~
|
|
|
|
Register 0x0004 holds the DMA Transfer Status:
|
|
|
|
- bit 0: read completed
|
|
- bit 1: write completed
|
|
- bit 2: DMA read error
|
|
- bit 3: DMA write error
|
|
- bit 4: Scatter-Gather array error
|
|
|
|
Non-compressed file format
|
|
--------------------------
|
|
|
|
The cx23416 can produce (and the cx23415 can also read) raw YUV output. The
|
|
format of a YUV frame is specific to this chip and is called HM12. 'HM' stands
|
|
for 'Hauppauge Macroblock', which is a misnomer as 'Conexant Macroblock' would
|
|
be more accurate.
|
|
|
|
The format is YUV 4:2:0 which uses 1 Y byte per pixel and 1 U and V byte per
|
|
four pixels.
|
|
|
|
The data is encoded as two macroblock planes, the first containing the Y
|
|
values, the second containing UV macroblocks.
|
|
|
|
The Y plane is divided into blocks of 16x16 pixels from left to right
|
|
and from top to bottom. Each block is transmitted in turn, line-by-line.
|
|
|
|
So the first 16 bytes are the first line of the top-left block, the
|
|
second 16 bytes are the second line of the top-left block, etc. After
|
|
transmitting this block the first line of the block on the right to the
|
|
first block is transmitted, etc.
|
|
|
|
The UV plane is divided into blocks of 16x8 UV values going from left
|
|
to right, top to bottom. Each block is transmitted in turn, line-by-line.
|
|
|
|
So the first 16 bytes are the first line of the top-left block and
|
|
contain 8 UV value pairs (16 bytes in total). The second 16 bytes are the
|
|
second line of 8 UV pairs of the top-left block, etc. After transmitting
|
|
this block the first line of the block on the right to the first block is
|
|
transmitted, etc.
|
|
|
|
The code below is given as an example on how to convert HM12 to separate
|
|
Y, U and V planes. This code assumes frames of 720x576 (PAL) pixels.
|
|
|
|
The width of a frame is always 720 pixels, regardless of the actual specified
|
|
width.
|
|
|
|
If the height is not a multiple of 32 lines, then the captured video is
|
|
missing macroblocks at the end and is unusable. So the height must be a
|
|
multiple of 32.
|
|
|
|
Raw format c example
|
|
~~~~~~~~~~~~~~~~~~~~
|
|
|
|
.. code-block:: c
|
|
|
|
#include <stdio.h>
|
|
#include <stdlib.h>
|
|
#include <string.h>
|
|
|
|
static unsigned char frame[576*720*3/2];
|
|
static unsigned char framey[576*720];
|
|
static unsigned char frameu[576*720 / 4];
|
|
static unsigned char framev[576*720 / 4];
|
|
|
|
static void de_macro_y(unsigned char* dst, unsigned char *src, int dstride, int w, int h)
|
|
{
|
|
unsigned int y, x, i;
|
|
|
|
// descramble Y plane
|
|
// dstride = 720 = w
|
|
// The Y plane is divided into blocks of 16x16 pixels
|
|
// Each block in transmitted in turn, line-by-line.
|
|
for (y = 0; y < h; y += 16) {
|
|
for (x = 0; x < w; x += 16) {
|
|
for (i = 0; i < 16; i++) {
|
|
memcpy(dst + x + (y + i) * dstride, src, 16);
|
|
src += 16;
|
|
}
|
|
}
|
|
}
|
|
}
|
|
|
|
static void de_macro_uv(unsigned char *dstu, unsigned char *dstv, unsigned char *src, int dstride, int w, int h)
|
|
{
|
|
unsigned int y, x, i;
|
|
|
|
// descramble U/V plane
|
|
// dstride = 720 / 2 = w
|
|
// The U/V values are interlaced (UVUV...).
|
|
// Again, the UV plane is divided into blocks of 16x16 UV values.
|
|
// Each block in transmitted in turn, line-by-line.
|
|
for (y = 0; y < h; y += 16) {
|
|
for (x = 0; x < w; x += 8) {
|
|
for (i = 0; i < 16; i++) {
|
|
int idx = x + (y + i) * dstride;
|
|
|
|
dstu[idx+0] = src[0]; dstv[idx+0] = src[1];
|
|
dstu[idx+1] = src[2]; dstv[idx+1] = src[3];
|
|
dstu[idx+2] = src[4]; dstv[idx+2] = src[5];
|
|
dstu[idx+3] = src[6]; dstv[idx+3] = src[7];
|
|
dstu[idx+4] = src[8]; dstv[idx+4] = src[9];
|
|
dstu[idx+5] = src[10]; dstv[idx+5] = src[11];
|
|
dstu[idx+6] = src[12]; dstv[idx+6] = src[13];
|
|
dstu[idx+7] = src[14]; dstv[idx+7] = src[15];
|
|
src += 16;
|
|
}
|
|
}
|
|
}
|
|
}
|
|
|
|
/*************************************************************************/
|
|
int main(int argc, char **argv)
|
|
{
|
|
FILE *fin;
|
|
int i;
|
|
|
|
if (argc == 1) fin = stdin;
|
|
else fin = fopen(argv[1], "r");
|
|
|
|
if (fin == NULL) {
|
|
fprintf(stderr, "cannot open input\n");
|
|
exit(-1);
|
|
}
|
|
while (fread(frame, sizeof(frame), 1, fin) == 1) {
|
|
de_macro_y(framey, frame, 720, 720, 576);
|
|
de_macro_uv(frameu, framev, frame + 720 * 576, 720 / 2, 720 / 2, 576 / 2);
|
|
fwrite(framey, sizeof(framey), 1, stdout);
|
|
fwrite(framev, sizeof(framev), 1, stdout);
|
|
fwrite(frameu, sizeof(frameu), 1, stdout);
|
|
}
|
|
fclose(fin);
|
|
return 0;
|
|
}
|
|
|
|
|
|
Format of embedded V4L2_MPEG_STREAM_VBI_FMT_IVTV VBI data
|
|
---------------------------------------------------------
|
|
|
|
Author: Hans Verkuil <hverkuil@xs4all.nl>
|
|
|
|
|
|
This section describes the V4L2_MPEG_STREAM_VBI_FMT_IVTV format of the VBI data
|
|
embedded in an MPEG-2 program stream. This format is in part dictated by some
|
|
hardware limitations of the ivtv driver (the driver for the Conexant cx23415/6
|
|
chips), in particular a maximum size for the VBI data. Anything longer is cut
|
|
off when the MPEG stream is played back through the cx23415.
|
|
|
|
The advantage of this format is it is very compact and that all VBI data for
|
|
all lines can be stored while still fitting within the maximum allowed size.
|
|
|
|
The stream ID of the VBI data is 0xBD. The maximum size of the embedded data is
|
|
4 + 43 * 36, which is 4 bytes for a header and 2 * 18 VBI lines with a 1 byte
|
|
header and a 42 bytes payload each. Anything beyond this limit is cut off by
|
|
the cx23415/6 firmware. Besides the data for the VBI lines we also need 36 bits
|
|
for a bitmask determining which lines are captured and 4 bytes for a magic cookie,
|
|
signifying that this data package contains V4L2_MPEG_STREAM_VBI_FMT_IVTV VBI data.
|
|
If all lines are used, then there is no longer room for the bitmask. To solve this
|
|
two different magic numbers were introduced:
|
|
|
|
'itv0': After this magic number two unsigned longs follow. Bits 0-17 of the first
|
|
unsigned long denote which lines of the first field are captured. Bits 18-31 of
|
|
the first unsigned long and bits 0-3 of the second unsigned long are used for the
|
|
second field.
|
|
|
|
'ITV0': This magic number assumes all VBI lines are captured, i.e. it implicitly
|
|
implies that the bitmasks are 0xffffffff and 0xf.
|
|
|
|
After these magic cookies (and the 8 byte bitmask in case of cookie 'itv0') the
|
|
captured VBI lines start:
|
|
|
|
For each line the least significant 4 bits of the first byte contain the data type.
|
|
Possible values are shown in the table below. The payload is in the following 42
|
|
bytes.
|
|
|
|
Here is the list of possible data types:
|
|
|
|
.. code-block:: c
|
|
|
|
#define IVTV_SLICED_TYPE_TELETEXT 0x1 // Teletext (uses lines 6-22 for PAL)
|
|
#define IVTV_SLICED_TYPE_CC 0x4 // Closed Captions (line 21 NTSC)
|
|
#define IVTV_SLICED_TYPE_WSS 0x5 // Wide Screen Signal (line 23 PAL)
|
|
#define IVTV_SLICED_TYPE_VPS 0x7 // Video Programming System (PAL) (line 16)
|
|
|