Main Content

select

Create reader for selected subset of ADTF DAT file data

Since R2022a

Description

Use the select object function to create a reader for a selected subset of stream data to read from the ADTF DAT file. You can select streams using either the stream indices or stream name. Additionally, you can specify an index range or time range of data, to select from each of the specified streams. The select function returns an adtfStreamReader object, which you can use to read data from the selected streams in the ADTF DAT file.

streamReader = select(adtfReader) creates an adtfStreamReader object, streamReader, that can read data from all streams in the Automotive Data and Time-Triggered Framework (ADTF) DAT file associated with the specified adtfFileReader object adtfReader.

example

streamReader = select(adtfReader,streamIndices) specifies a subset of streams from the ADTF DAT file using the stream indices streamIndices.

streamReader = select(adtfReader,streamName) specifies a data stream from the ADTF DAT file using the stream name streamName.

streamReader = select(___,Name=Value) specifies an additional option using one Name=Value pair argument, in addition to any combination of input arguments from previous syntaxes. You must use only one name-value argument, specifying either the index range or time range of data to read from the selected streams. For example, IndexRange=[1 30] selects the first thirty frames of data from each selected stream.

Examples

collapse all

This example shows how to extract and visualize a video stream, stored in an ADTF DAT file. It also shows how to write the video stream into a video file.

Download the sample video DAT file.

downloadURL  = 'https://ssd.mathworks.com/supportfiles/driving/data/sample_can_video_dat.zip';
dataFolder   = fullfile(tempdir, 'adtf-video', filesep); 
options      = weboptions('Timeout', Inf);
zipFileName  = [dataFolder, 'sample_can_video_dat.zip'];
folderExists = exist(dataFolder, 'dir');

% Create a folder in a temporary directory to save the downloaded file.
if ~folderExists  
    mkdir(dataFolder); 
    disp('Downloading sample_can_video_dat.zip (9.74 MB)...') 
    websave(zipFileName, downloadURL, options); 
    
    % Extract contents of the downloaded file.
    disp('Extracting sample_can_video_dat.zip...') 
    unzip(zipFileName, dataFolder); 
end
Downloading sample_can_video_dat.zip (9.74 MB)...
Extracting sample_can_video_dat.zip...

Create the ADTF File Reader object.

datFileName = fullfile(dataFolder,"sample_can_video.dat");
fileReader  = adtfFileReader(datFileName) 
fileReader = 
              DataFileName: "C:\Users\latriwal\AppData\Local\Temp\adtf-video\sample_can_video.dat"
       DescriptionFileName: ""
           PluginDirectory: ""
               StreamCount: 2
                StreamInfo: 

    StreamIndex    StreamName      StreamType      StartTime     EndTime      ItemCount    SubstreamInfo
    ___________    __________    ______________    _________    __________    _________    _____________

         1         {'rawcan'}    {'UNRESOLVED'}      0 sec      14.805 sec       743       {0×1 struct} 
         2         {'video' }    {'adtf/image'}      0 sec      14.799 sec       149       {0×1 struct} 


From the StreamInfo property, note that the index of the video stream is 2. Use the select function of the adtfFileReader object, to select the video stream for reading. The returned adtfStreamReader object has all the information about the selection.

streamReader = select(fileReader,2) 
streamReader = 
  adtfStreamReader with properties:

           DataFileName: "C:\Users\latriwal\AppData\Local\Temp\adtf-video\sample_can_video.dat"
    DescriptionFileName: ""
        PluginDirectory: ""
            StreamIndex: 2
             StartIndex: 1
               EndIndex: 149
     CurrentIndexOffset: 0
              StartTime: [0×0 duration]
                EndTime: [0×0 duration]
              DataCount: 149

Note that the value of CurrentIndexOffset is 0. This signifies that the next readNext call will return the first item.

Preview the first image frame from the stream.

firstFrame = readNext(streamReader);
imshow(firstFrame.Data.Item)

Figure contains an axes object. The axes object contains an object of type image.

Before creating a video, use the reset function to start reading from the first frame. This resets the value of CurrentIndexOffset to 0.

reset(streamReader);
fprintf("CurrentIndexOffset = %d\n",streamReader.CurrentIndexOffset)
CurrentIndexOffset = 0

Create a VideoWriter object that you can use to write image frames to a video file. Specify a frame rate of 1 frame per second.

videoWriterObj = VideoWriter("example_video.avi"); 
videoWriterObj.FrameRate = 1; 
open(videoWriterObj); 

Using the streamReader object, iterate over the data items in the selection one-by-one. The hasNext function determines if there is an item left to read as we are incrementally reading the file. readNext returns the data item which is basically a structure containing the data and the associated timestamp. In every iteration, extract the image frame and write it to the video file.

while streamReader.hasNext()
    streamData = streamReader.readNext(); 
    imageFrame = streamData.Data.Item; 
    frame      = im2frame(streamData.Data.Item, gray); 
    writeVideo(videoWriterObj, frame); 
end 

Alternatively, you can read all the image frames at once, using the read function, and iterate over it later.

allData = read(streamReader)
allData = struct with fields:
    StreamIndex: 2
           Data: [149×1 struct]

Close the connection with the video file.

close(videoWriterObj);
close all

Visualize the output file example_video.avi using Video Viewer.

implay("example_video.avi") 

{"String":"Figure Movie Player contains an axes object and other objects of type uiflowcontainer, uimenu, uitoolbar. The axes object contains an object of type image.","Tex":[],"LaTex":[]}

Input Arguments

collapse all

ADTF file reader, specified as an adtfFileReader object.

Linear indices of the streams to select, specified as a vector of positive integers.

Name of the stream to select, specified as a string scalar.

Name-Value Arguments

Specify optional pair of arguments as Name=Value, where Name is the argument name and Value is the corresponding value. This function supports only one Name-value argument per syntax and it must appear after other arguments.

Example: select(adtfReader,IndexRange=[1 10]) selects the first 10 frames from each stream of the ADTF DAT file associated with the specified ADTF file reader.

Index range of data to select from the selected streams, specified as a two-element vector of positive integers. The first element specifies the initial index to select from each stream, and the second element specifies the final index to select from each stream.

Time range of data to select from selected streams, specified as a two-element duration vector of the form [startTime endTime].

Output Arguments

collapse all

Stream reader, returned as an adtfStreamReader object. This object enables you to read data from the selected streams in the ADTF DAT file.

Version History

Introduced in R2022a