The IDLffMJPEG2000::GetSequentialData function method returns the frame index number and retrieves the associated frame data from the frame buffer. The StartSequentialReading method, which loads data into the frame buffer, must be called before calling this method.
The StartSequentialReading, GetSequentialData, ReleaseSequentialData and StopSequentialReading methods are used with a timer mechanism to create a sequential playback.
Note: Always use a widget timer or IDLitWindow timer mechanism to control the playback rate. Avoid using the WAIT procedure with sequential playback methods as the interaction between the procedure and the background processing thread will cause adverse side effects on UNIX platforms.
This method will throw an error if retrieval fails. A CATCH statement can be used to trap these errors.
Syntax
Result = Obj->[IDLffMJPEG2000::]GetSequentialData( Data [, FRAME_NUMBER=variable] [, FRAME_PERIOD=value] [, STEP=value] )
Return Value
If frame data is available in the frame buffer, the method returns a long value indicating the frame buffer index value. This index value is then used by the ReleaseSequentialData call to release the frame.
If no frame data is available, the return index value is -1. This indicates data is being read faster than it is being decompressed.
Arguments
Data
If data is available, the Data variable will contain a two- or three-dimensional array associated with the returned frame index value. This data is essentially a pointer to a slot in the frame buffer, and not a copy of the frame data. Do not attempt to modify this data as it is automatically freed when the ReleaseSequentialData method is called.
The array dimensions depend upon IDLffMJPEG2000::StartSequentialReading method keywords as follows:
Keyword |
Result |
RGB
|
RGB is set—array dimensions are [3, width, height].
|
RGB is not set—array dimensions are [nComponents, width, height] where nComponents, the number of bands or channels of data, depends on the COMPONENT and N_COMPONENTS keyword settings.
If a starting COMPONENT is set, nComponents equals the value specified in N_COMPONENTS unless N_COMPONENTS=1. In this case the array dimensions are [Width, Height].
If a starting COMPONENT is set, but N_COMPONENTS is not set, nComponents equals all available components from the starting component.
If a starting COMPONENT is not set, then nComponents equalsall available components.
|
REGION
|
REGION is set—the array width and height are determined by the width and height values in the 4-element REGION vector [startX, startY, width, height].
|
TILE_INDEX
|
TILE_INDEX is set—the array width and height values equal the dimensions of a single tile, as defined in the TILE_DIMENSIONS property.
|
The data type of the result is automatically determined using the BIT_DEPTH and SIGNED properties of the returned components as follows:
Data Properties |
Result |
BIT_DEPTH ≤ 8 or RGB is set
|
Byte |
BIT_DEPTH ≥9 or ≤16
|
Integer or unsigned integer
|
BIT_DEPTH >16 |
Long or unsigned long
|
Note: All components in the MJ2 file must have the same bit depth and be either signed or unsigned. Components with different bit depths or a mixture of signed and unsigned data are not supported.
Keywords
FRAME_NUMBER
A variable that will contain the long frame number of the frame that GetSequentialData is currently accessing.
FRAME_PERIOD
A long value specifying the duration of a frame in ticks. Each frame in an MJ2 file can have a unique frame period, which lets you display individual frames for different lengths of time. The FRAME_PERIOD acts in conjunction with the TIMESCALE property to determine the playback rate. See Computing Playback Rate for details.
STEP
A long value indicating the number of frames to skip when retrieving frames from the frame buffer as follows:
Value |
Description |
0 |
Reads the next sequential frame (the default)
|
Positive value |
Indicates the number of frames to skip when reading frames in the forward direction
|
Negative value |
Indicates the number of frames to skip when reading frames in the reverse direction
|
Note: This keyword is intended to be used for manually stepping through frames when sequential playback is paused. This keyword should not be used to skip frames during continuous playback.
If the STEP value results in a frame request that is beyond the range of values defined by IDLffMJPEG2000::StartSequentialReading START_FRAME and STOP_FRAME keywords, the request will wrap to return the appropriate frame.
Examples
The following simple program uses the four sequential playback methods: StartSequentialReading, GetSequentialData, ReleaseSequentialData and StopSequentialReading to display a sample MJ2 animation.
Note: In this example, the playback speed is equal to the frame rate calculated for the first frame. A more sophisticated example would handle varying frame rates.
PRO mj2_simple_sequential_doc_event, sEvent
COMPILE_OPT IDL2, HIDDEN
WIDGET_CONTROL, sEvent.top, GET_UVALUE=pState
IF (TAG_NAMES(sEvent, /STRUCTURE_NAME) EQ 'WIDGET_TIMER') $
THEN BEGIN
frameIndex = (*pstate).oMJPEG2000->GetSequentialData(Data)
IF (frameIndex NE -1) THEN BEGIN
TV, Data, TRUE=1
(*pState).oMJPEG2000->ReleaseSequentialData, frameIndex
ENDIF
WIDGET_CONTROL, (*pState).wBase, Timer=(*pState).vFrameRate
ENDIF
END
PRO mj2_timer_doc_cleanup, id
WIDGET_CONTROL, id, GET_UVALUE=pState
Status = (*pState).oMJPEG2000->StopSequentialReading()
OBJ_DESTROY, (*pState).oMJPEG2000
PTR_FREE, pState
END
PRO mj2_simple_sequential_doc
oMJPEG2000 = Obj_New('IDLffMJPEG2000', $
FILEPATH('idl_mjpeg2000_example.mj2', $
SUBDIRECTORY=['examples','mjpeg2000']))
oMJPEG2000->GetProperty, N_FRAMES=nFrames, $
DIMENSIONS=imageSize, FRAME_PERIOD=vFramePeriod, $
TIMESCALE=vTimeScale
vFrameRate = FLOAT(vFramePeriod)/vTimeScale
vFramePerSec = STRING(1/(vFrameRate))
PRINT, "Frames per second = " + vFramePerSec
wBase = WIDGET_BASE(/COLUMN, $
TITLE="Simple Sequential Playback", $
KILL_NOTIFY='mj2_timer_doc_cleanup', UVALUE='TIMER')
wDraw = WIDGET_DRAW(wBase, XSIZE =imageSize[0], $
YSIZE=imageSIZE[1])
WIDGET_CONTROL,/REALIZE, wBase
WIDGET_CONTROL, wBase, TIMER=vFrameRate
Status = oMJPEG2000->StartSequentialReading(/RGB)
state = {oMJPEG2000:oMJPEG2000, wBase:wBase, $
vFrameRate:vFrameRate}
pState = PTR_NEW(state)
WIDGET_CONTROL, wBase, set_UVALUE=pstate
XMANAGER, 'mj2_simple_sequential_doc', wBase, /NO_BLOCK
END
This example mj2_simple_sequential_doc.pro, is located in the examples/doc/objects subdirectory of the IDL distribution. Run the example procedure by entering mj2_simple_sequential_doc at the IDL command prompt or view the file in an IDL Editor window by entering .EDIT mj2_simple_sequential_doc.pro.
Version History