openMSX
|
Interface for getting lines from a video frame. More...
#include <FrameSource.hh>
Public Types | |
enum | FieldType { FIELD_NONINTERLACED , FIELD_EVEN , FIELD_ODD } |
What role does this frame play in interlacing? More... | |
Public Member Functions | |
void | init (FieldType fieldType_) |
(Re)initialize an existing FrameSource. More... | |
FieldType | getField () const |
Gets the role this frame plays in interlacing. More... | |
unsigned | getHeight () const |
Gets the number of lines in this frame. More... | |
virtual unsigned | getLineWidth (unsigned line) const =0 |
Gets the number of display pixels on the given line. More... | |
unsigned | getWidth () const |
Get the width of (all) lines in this frame. More... | |
template<std::unsigned_integral Pixel> | |
Pixel | getLineColor (unsigned line) const |
Get the (single) color of the given line. More... | |
template<std::unsigned_integral Pixel> | |
const Pixel * | getLinePtr (int line, unsigned width, Pixel *buf) const |
Gets a pointer to the pixels of the given line number. More... | |
template<std::unsigned_integral Pixel> | |
const Pixel * | getMultiLinePtr (int line, unsigned numLines, unsigned &actualLines, unsigned width, Pixel *buf) const |
Similar to the above getLinePtr() method, but now tries to get multiple lines at once. More... | |
virtual const void * | getLineInfo (unsigned line, unsigned &lineWidth, void *buf, unsigned bufWidth) const =0 |
Abstract implementation of getLinePtr(). More... | |
template<std::unsigned_integral Pixel> | |
const Pixel * | getLinePtr320_240 (unsigned line, Pixel *buf) const |
Get a pointer to a given line in this frame, the frame is scaled to 320x240 pixels. More... | |
template<std::unsigned_integral Pixel> | |
const Pixel * | getLinePtr640_480 (unsigned line, Pixel *buf) const |
Get a pointer to a given line in this frame, the frame is scaled to 640x480 pixels. More... | |
template<std::unsigned_integral Pixel> | |
const Pixel * | getLinePtr960_720 (unsigned line, Pixel *buf) const |
Get a pointer to a given line in this frame, the frame is scaled to 960x720 pixels. More... | |
virtual unsigned | getRowLength () const |
Returns the distance (in pixels) between two consecutive lines. More... | |
const PixelFormat & | getPixelFormat () const |
Protected Member Functions | |
FrameSource (const PixelFormat &format) | |
~FrameSource ()=default | |
void | setHeight (unsigned height_) |
virtual bool | hasContiguousStorage () const |
Returns true when two consecutive rows are also consecutive in memory. More... | |
template<std::unsigned_integral Pixel> | |
void | scaleLine (const Pixel *in, Pixel *out, unsigned inWidth, unsigned outWidth) const |
Interface for getting lines from a video frame.
Definition at line 16 of file FrameSource.hh.
What role does this frame play in interlacing?
Enumerator | |
---|---|
FIELD_NONINTERLACED | Interlacing is off for this frame. |
FIELD_EVEN | Interlacing is on and this is an even frame. |
FIELD_ODD | Interlacing is on and this is an odd frame. |
Definition at line 21 of file FrameSource.hh.
|
explicitprotected |
Definition at line 14 of file FrameSource.cc.
References openmsx::DiskImageUtils::format().
|
protecteddefault |
|
inline |
Gets the role this frame plays in interlacing.
Definition at line 40 of file FrameSource.hh.
|
inline |
Gets the number of lines in this frame.
Definition at line 46 of file FrameSource.hh.
Referenced by openmsx::Scaler1< Pixel >::dispatchScale(), openmsx::Scaler2< Pixel >::dispatchScale(), openmsx::Scaler3< Pixel >::dispatchScale(), openmsx::RawFrame::getLineInfo(), getLinePtr(), getLinePtr320_240(), getLinePtr640_480(), getLinePtr960_720(), openmsx::RawFrame::getLineWidth(), openmsx::Deflicker::init(), openmsx::SuperImposedFrame::init(), openmsx::DeinterlacedFrame::init(), openmsx::DoubledFrame::init(), openmsx::GLPostProcessor::paint(), openmsx::RawFrame::setBlank(), openmsx::RawFrame::setLineWidth(), and openmsx::SuperImposedVideoFrame< Pixel >::SuperImposedVideoFrame().
|
inline |
Get the (single) color of the given line.
Typically this will be used to get the color of a vertical border line. But it's fine to call this on non-border lines as well, in that case the color of the first pixel of the line is returned.
Definition at line 76 of file FrameSource.hh.
References ALIGNAS_SSE, and getLineInfo().
Referenced by openmsx::Scaler1< Pixel >::scaleBlank1to1(), openmsx::Scaler2< Pixel >::scaleBlank1to1(), openmsx::Scaler2< Pixel >::scaleBlank1to2(), openmsx::SaI2xScaler< Pixel >::scaleBlank1to2(), openmsx::Scaler3< Pixel >::scaleBlank1to3(), openmsx::RGBTriplet3xScaler< Pixel >::scaleBlank1to3(), openmsx::SaI3xScaler< Pixel >::scaleBlank1to3(), openmsx::Scaler1< Pixel >::scaleBlank2to1(), openmsx::Scaler3< Pixel >::scaleBlank2to3(), and openmsx::RGBTriplet3xScaler< Pixel >::scaleBlank2to3().
|
pure virtual |
Abstract implementation of getLinePtr().
Pixel type is unspecified (implementations that care about the exact type should get it via some other mechanism).
line | The line number for the requested line. |
lineWidth | Output parameter, the width of the returned line in pixel units. |
buf | Buffer space that can optionally be used by the implementation. |
bufWidth | The size of the above buffer, in pixel units. |
Implemented in openmsx::SuperImposedVideoFrame< Pixel >, and openmsx::RawFrame.
Referenced by getLineColor(), getLinePtr(), and getMultiLinePtr().
|
inline |
Gets a pointer to the pixels of the given line number.
The line returned is guaranteed to have the given width. If the original line had a different width the result will be computed in the provided work buffer. So that buffer should be big enough to hold the scaled line. This also means the lifetime of the result is tied to the lifetime of that work buffer. In any case the return value of this function will point to the line data (some internal buffer or the work buffer).
Definition at line 93 of file FrameSource.hh.
References getHeight(), getLineInfo(), gl::max(), and scaleLine().
Referenced by openmsx::doHQScale2(), openmsx::doHQScale3(), getLinePtr320_240(), getLinePtr640_480(), getLinePtr960_720(), getMultiLinePtr(), openmsx::Scaler1< Pixel >::scale1x1to1x1(), openmsx::Scaler2< Pixel >::scale1x1to1x1(), openmsx::Scaler2< Pixel >::scale1x1to1x2(), openmsx::SaI2xScaler< Pixel >::scale1x1to1x2(), openmsx::Scale2xScaler< Pixel >::scale1x1to1x2(), openmsx::SaI2xScaler< Pixel >::scale1x1to2x2(), openmsx::Scale2xScaler< Pixel >::scale1x1to2x2(), openmsx::Scale3xScaler< Pixel >::scale1x1to3x3(), openmsx::Scaler1< Pixel >::scale1x2to1x1(), openmsx::MLAAScaler< Pixel >::scaleImage(), openmsx::GLHQLiteScaler::uploadBlock(), and openmsx::GLHQScaler::uploadBlock().
template const uint32_t * openmsx::FrameSource::getLinePtr320_240< uint32_t > | ( | unsigned | line, |
Pixel * | buf | ||
) | const |
Get a pointer to a given line in this frame, the frame is scaled to 320x240 pixels.
The difference between this method and getLinePtr() is that this method also does vertical scaling. This is used for video recording.
Definition at line 20 of file FrameSource.cc.
References ALIGNAS_SSE, getHeight(), and getLinePtr().
template const uint32_t * openmsx::FrameSource::getLinePtr640_480< uint32_t > | ( | unsigned | line, |
Pixel * | buf | ||
) | const |
Get a pointer to a given line in this frame, the frame is scaled to 640x480 pixels.
Same as getLinePtr320_240, but then for a higher resolution output.
Definition at line 37 of file FrameSource.cc.
References getHeight(), and getLinePtr().
template const uint32_t * openmsx::FrameSource::getLinePtr960_720< uint32_t > | ( | unsigned | line, |
Pixel * | buf | ||
) | const |
Get a pointer to a given line in this frame, the frame is scaled to 960x720 pixels.
Same as getLinePtr320_240, but then for a higher resolution output.
Definition at line 48 of file FrameSource.cc.
References ALIGNAS_SSE, getHeight(), and getLinePtr().
|
pure virtual |
Gets the number of display pixels on the given line.
Implemented in openmsx::SuperImposedVideoFrame< Pixel >, openmsx::RawFrame, and openmsx::Deflicker.
Referenced by openmsx::PostProcessor::getLineWidth(), getMultiLinePtr(), getWidth(), openmsx::SaI2xScaler< Pixel >::scaleBlank1to2(), openmsx::RGBTriplet3xScaler< Pixel >::scaleBlank1to3(), and openmsx::SaI3xScaler< Pixel >::scaleBlank1to3().
|
inline |
Similar to the above getLinePtr() method, but now tries to get multiple lines at once.
This is not always possible, so the actual number of lines is returned in 'actualLines', it will always be at least 1.
Definition at line 115 of file FrameSource.hh.
References getLineInfo(), getLinePtr(), getLineWidth(), hasContiguousStorage(), and scaleLine().
|
inline |
Definition at line 192 of file FrameSource.hh.
Referenced by openmsx::yuv2rgb::convert(), and openmsx::PostProcessor::takeRawScreenShot().
|
inlinevirtual |
Returns the distance (in pixels) between two consecutive lines.
Is meant to be used in combination with getMultiLinePtr(). The result is only meaningful when hasContiguousStorage() returns true (also only in that case does getMultiLinePtr() return more than 1 line).
Reimplemented in openmsx::RawFrame.
Definition at line 188 of file FrameSource.hh.
|
inline |
Get the width of (all) lines in this frame.
This only makes sense when all lines have the same width, so this methods asserts that all lines actually have the same width. This is for example not always the case for MSX frames, but it is for video frames (for superimpose).
Definition at line 61 of file FrameSource.hh.
References getLineWidth(), and xrange().
|
inlineprotectedvirtual |
Returns true when two consecutive rows are also consecutive in memory.
Reimplemented in openmsx::RawFrame.
Definition at line 205 of file FrameSource.hh.
Referenced by getMultiLinePtr().
|
inline |
(Re)initialize an existing FrameSource.
This method sets the Fieldtype and flushes the 'getLinePtr' buffers.
Definition at line 36 of file FrameSource.hh.
Referenced by openmsx::Deflicker::init(), openmsx::DeinterlacedFrame::init(), openmsx::DoubledFrame::init(), and openmsx::RawFrame::RawFrame().
|
protected |
Definition at line 69 of file FrameSource.cc.
References gl::scale(), UNREACHABLE, and VLA_SSE_ALIGNED.
Referenced by getLinePtr(), and getMultiLinePtr().
|
inlineprotected |
Definition at line 200 of file FrameSource.hh.
Referenced by openmsx::Deflicker::init(), openmsx::SuperImposedFrame::init(), openmsx::DeinterlacedFrame::init(), openmsx::DoubledFrame::init(), openmsx::RawFrame::RawFrame(), and openmsx::SuperImposedVideoFrame< Pixel >::SuperImposedVideoFrame().