mirror of
https://gitlab.freedesktop.org/gstreamer/gstreamer.git
synced 2024-12-04 07:26:33 +00:00
102 lines
3.3 KiB
Markdown
102 lines
3.3 KiB
Markdown
# Interlaced Video
|
|
|
|
Video buffers have a number of states identifiable through a combination
|
|
of caps and buffer flags.
|
|
|
|
Possible states:
|
|
- Progressive
|
|
- Interlaced
|
|
- Plain
|
|
- One field
|
|
- Two fields
|
|
- Three fields - this should be a progressive buffer with a repeated 'first'
|
|
field that can be used for telecine pulldown
|
|
- Telecine
|
|
- One field
|
|
- Two fields
|
|
- Progressive
|
|
- Interlaced (a.k.a. 'mixed'; the fields are from different frames)
|
|
- Three fields - this should be a progressive buffer with a repeated 'first'
|
|
field that can be used for telecine pulldown
|
|
|
|
Note: It can be seen that the difference between the plain interlaced
|
|
and telecine states is that in the latter, buffers containing
|
|
two fields may be progressive.
|
|
|
|
Tools for identification:
|
|
- `GstVideoInfo`
|
|
- `GstVideoInterlaceMode` - enum `GST_VIDEO_INTERLACE_MODE_...`
|
|
- PROGRESSIVE
|
|
- INTERLEAVED
|
|
- MIXED
|
|
- Buffers flags - `GST_VIDEO_BUFFER_FLAG_...`
|
|
- TFF
|
|
- RFF
|
|
- ONEFIELD
|
|
- INTERLACED
|
|
|
|
## Identification of Buffer States
|
|
|
|
Note that flags are not necessarily interpreted in the same way for all
|
|
different states nor are they necessarily required nor make sense in all
|
|
cases.
|
|
|
|
### Progressive
|
|
|
|
If the interlace mode in the video info corresponding to a buffer is
|
|
**"progressive"**, then the buffer is progressive.
|
|
|
|
### Plain Interlaced
|
|
|
|
If the video info interlace mode is **"interleaved"**, then the buffer is
|
|
plain interlaced.
|
|
|
|
`GST_VIDEO_BUFFER_FLAG_TFF` indicates whether the top or bottom field
|
|
is to be displayed first. The timestamp on the buffer corresponds to the
|
|
first field.
|
|
|
|
`GST_VIDEO_BUFFER_FLAG_RFF` indicates that the first field (indicated
|
|
by the TFF flag) should be repeated. This is generally only used for
|
|
telecine purposes but as the telecine state was added long after the
|
|
interlaced state was added and defined, this flag remains valid for
|
|
plain interlaced buffers.
|
|
|
|
`GST_VIDEO_BUFFER_FLAG_ONEFIELD` means that only the field indicated
|
|
through the TFF flag is to be used. The other field should be ignored.
|
|
|
|
### Telecine
|
|
|
|
If video info interlace mode is **"mixed"** then the buffers are in some
|
|
form of telecine state.
|
|
|
|
The `TFF` and `ONEFIELD` flags have the same semantics as for the plain
|
|
interlaced state.
|
|
|
|
`GST_VIDEO_BUFFER_FLAG_RFF` in the telecine state indicates that the
|
|
buffer contains only repeated fields that are present in other buffers
|
|
and are as such unneeded. For example, in a sequence of three telecined
|
|
frames, we might have:
|
|
|
|
AtAb AtBb BtBb
|
|
|
|
In this situation, we only need the first and third buffers as the
|
|
second buffer contains fields present in the first and third.
|
|
|
|
Note that the following state can have its second buffer identified
|
|
using the `ONEFIELD` flag (and `TFF` not set):
|
|
|
|
AtAb AtBb BtCb
|
|
|
|
The telecine state requires one additional flag to be able to identify
|
|
progressive buffers.
|
|
|
|
The presence of the `GST_VIDEO_BUFFER_FLAG_INTERLACED` means that the
|
|
buffer is an 'interlaced' or 'mixed' buffer that contains two fields
|
|
that, when combined with fields from adjacent buffers, allow
|
|
reconstruction of progressive frames. The absence of the flag implies
|
|
the buffer containing two fields is a progressive frame.
|
|
|
|
For example in the following sequence, the third buffer would be mixed
|
|
(yes, it is a strange pattern, but it can happen):
|
|
|
|
AtAb AtBb BtCb CtDb DtDb
|