NvV4l2ElementPlane Class Reference

Helper Class for operations performed on a V4L2 Element plane. More...

#include <NvV4l2ElementPlane.h>

List of all members.

Public Types

typedef bool(* dqThreadCallback )(struct v4l2_buffer *v4l2_buf, NvBuffer *buffer, NvBuffer *shared_buffer, void *data)
 This is a callback function type which is called by the DQ Thread when it successfully dequeues a buffer from the plane.

Public Member Functions

int getFormat (struct v4l2_format &format)
 Get the plane format.
int setFormat (struct v4l2_format &format)
 Set the plane format.
int getCrop (struct v4l2_crop &crop)
 Get the cropping rectangle for the plane.
int setSelection (uint32_t target, uint32_t flags, struct v4l2_rect &rect)
 Set the selection rectangle for the plane.
int reqbufs (enum v4l2_memory mem_type, uint32_t num)
 Request for buffers on the plane.
int queryBuffer (uint32_t buf_index)
 Query the status of buffer at index.
int exportBuffer (uint32_t buf_index)
 Export the buffer as DMABUF FD.
int setStreamStatus (bool status)
 Start or stop streaming on the plane.
bool getStreamStatus ()
 Check if the plane is streaming.
int setStreamParms (struct v4l2_streamparm &parm)
 Set streaming parameters.
int setupPlane (enum v4l2_memory mem_type, uint32_t num_buffers, bool map, bool allocate)
 Helper function which encapsulates all the function calls required to setup the plane for streaming.
void deinitPlane ()
 Helper function which encapsulates all the function calls required to deinitialize the plane for streaming.
enum v4l2_buf_type getBufType ()
 Get the streaming/buffer type of this plane.
NvBuffergetNthBuffer (uint32_t n)
 Get the NvBuffer object at index n.
int dqBuffer (struct v4l2_buffer &v4l2_buf, NvBuffer **buffer, NvBuffer **shared_buffer, uint32_t num_retries)
 Dequeue a buffer from the plane.
int qBuffer (struct v4l2_buffer &v4l2_buf, NvBuffer *shared_buffer)
 Queue a buffer on the plane.
uint32_t getNumBuffers ()
 Get the number of buffers allocated/requested on the plane.
uint32_t getNumPlanes ()
 Get the number of planes buffers on this plane contain for the currently set format.
void setBufferPlaneFormat (int n_planes, NvBuffer::NvBufferPlaneFormat *planefmts)
 Set the format of the planes of the buffer which will be used with this plane.
uint32_t getNumQueuedBuffers ()
 Get the number of buffers currently queued on the plane.
uint32_t getTotalDequeuedBuffers ()
 Get the total number of buffers dequeued from the plane.
uint32_t getTotalQueuedBuffers ()
 Get the total number of buffers queued on the plane.
int waitAllBuffersQueued (uint32_t max_wait_ms)
 Wait till all the buffers of the plane get queued.
int waitAllBuffersDequeued (uint32_t max_wait_ms)
 Wait till all the buffers of the plane get dequeued.
bool setDQThreadCallback (dqThreadCallback callback)
 Set the DQ Thread callback function.
int startDQThread (void *data)
 Start DQ Thread.
int stopDQThread ()
 Force stop the DQ Thread if it is running.
int waitForDQThread (uint32_t max_wait_ms)
 Wait for the DQ Thread to stop.

Public Attributes

pthread_mutex_t plane_lock
 Mutex lock used along with plane_cond.
pthread_cond_t plane_cond
 Plane condition which application can wait on to receive notifications from qBuffer/dqBuffer.

Private Member Functions

int isInError ()
 Indicates if the plane encountered an error during its operation.
 NvV4l2ElementPlane (enum v4l2_buf_type buf_type, const char *device_name, int &fd, bool blocking, NvElementProfiler &profiler)
 Creates a new V4l2Element plane.
 NvV4l2ElementPlane (const NvV4l2ElementPlane &that)
 Disallow copy constructor.
void operator= (NvV4l2ElementPlane const &)
 Disallow assignment.
 ~NvV4l2ElementPlane ()
 NvV4l2ElementPlane destructor.

Static Private Member Functions

static void * dqThread (void *v4l2_element_plane)
 The DQ thread function.

Private Attributes

int & fd
 FD of the V4l2 Element the plane is associated with.
const char * plane_name
 Name of the plane.
enum v4l2_buf_type buf_type
 Type of the stream.
bool blocking
 Whether the V4l2 element has been opened with blocking mode.
uint32_t num_buffers
 Number of buffers returned by VIDIOC_REQBUFS ioctl.
NvBuffer ** buffers
 Array of NvBuffer object pointers.
uint8_t n_planes
 Number of planes in the buffers.
NvBuffer::NvBufferPlaneFormat planefmts [MAX_PLANES]
 Format of the buffer planes.
enum v4l2_memory memory_type
 V4l2 memory type of the buffers.
uint32_t num_queued_buffers
 Number of buffers currently queued on the plane.
uint32_t total_queued_buffers
 Total number of buffers queued on the plane.
uint32_t total_dequeued_buffers
 Total number of buffers dequeued from the plane.
bool streamon
 Boolean indicating if the plane is streaming.
bool dqthread_running
 Boolean indicating if the DQ Thread is running.
bool stop_dqthread
 Boolean value used to signal the DQ Thread to stop.
pthread_t dq_thread
 pthread ID of the DQ Thread
dqThreadCallback callback
 Callback function used by the DQ Thread.
void * dqThread_data
 Application supplied pointer provided as an argument in dqThreadCallback.
NvElementProfilerv4l2elem_profiler
 A reference to the profiler belonging to the plane's parent element.
int is_in_error
 Indicates if an error was encountered during the operation of the element.
const char * comp_name
 Specifies the name of the component, for debugging.

Friends

class NvV4l2Element


Detailed Description

Helper Class for operations performed on a V4L2 Element plane.

This class is modelled on the planes of a V4L2 Element. It provides convenient wrapper functions around V4L2 ioctls associated with plane operations such as VIDIOC_G_FMT/VIDIOC_S_FMT, VIDIOC_REQBUFS,\ VIDIOC_STREAMON/VIDIOC_STREAMOFF, etc.

The plane buffer type can be either V4L2_BUF_TYPE_VIDEO_OUTPUT_MPLANE (for the output plane) or V4L2_BUF_TYPE_VIDEO_CAPTURE_MPLANE (for the capture plane).

The plane has an array of NvBuffer object pointers which is allocated and initialized during reqbufs call. These NvBuffer objects are similar to the v4l2_buffer structures which are queued/dequeued.

This class provides another feature useful for multi-threading. On calling startDQThread, it internally spawns a thread which runs infinitely till signalled to stop. This thread keeps on trying to dequeue a buffer from the plane and calls a dqThreadCallback function specified by the user on successful dequeue.

Definition at line 92 of file NvV4l2ElementPlane.h.


Member Typedef Documentation

typedef bool(* NvV4l2ElementPlane::dqThreadCallback)(struct v4l2_buffer *v4l2_buf, NvBuffer *buffer, NvBuffer *shared_buffer, void *data)

This is a callback function type which is called by the DQ Thread when it successfully dequeues a buffer from the plane.

Applications must implement this and set the callback using setDQThreadCallback.

Setting the stream to off will automatically stop this thread.

See also:
setDQThreadCallback, startDQThread
Parameters:
v4l2_buf v4l2_buffer structure which was used for dequeueing
buffer NvBuffer object at the index contained in v4l2_buf
shared_buffer If the plane shares buffer with another elements pointer to the NvBuffer object else NULL
data Pointer to application specific data which was set with startDQThread
Returns:
If the application implementing this calls returns false, the DQThread will be stopped else the DQThread will continue running.


Constructor & Destructor Documentation

NvV4l2ElementPlane::NvV4l2ElementPlane ( enum v4l2_buf_type  buf_type,
const char *  device_name,
int &  fd,
bool  blocking,
NvElementProfiler profiler 
) [private]

Creates a new V4l2Element plane.

Parameters:
[in] buf_type Type of the stream
[in] device_name Name of the element the plane belongs to
[in] fd FD of the device opened using v4l2_open
[in] blocking Whether the device has been opened with blocking mode

Definition at line 49 of file NvV4l2ElementPlane.cpp.

NvV4l2ElementPlane::NvV4l2ElementPlane ( const NvV4l2ElementPlane that  )  [private]

Disallow copy constructor.

NvV4l2ElementPlane::~NvV4l2ElementPlane (  )  [private]

NvV4l2ElementPlane destructor.

Calls deinitPlane internally.

Definition at line 97 of file NvV4l2ElementPlane.cpp.


Member Function Documentation

void NvV4l2ElementPlane::deinitPlane (  ) 

Helper function which encapsulates all the function calls required to deinitialize the plane for streaming.

For each of the buffers unmaps/deallocates memory depending on the memory type. Then, calls reqbufs with count zero.

See also:
setupPlane

Definition at line 351 of file NvV4l2ElementPlane.cpp.

int NvV4l2ElementPlane::dqBuffer ( struct v4l2_buffer &  v4l2_buf,
NvBuffer **  buffer,
NvBuffer **  shared_buffer,
uint32_t  num_retries 
)

Dequeue a buffer from the plane.

This is a blocking call. This call returns when a buffer is successfully dequeued or timeout is reached. If buffer is not NULL returns the NvBuffer object at the index returned by the VIDIOC_DQBUF ioctl. If this plane shares a buffer with other element and shared_buffer is not NULL returns the shared NvBuffer object in shared_buffer.

Parameters:
[in] v4l2_buf v4l2_buffer structure to be used for dequeueing
[out] buffer Returns the NvBuffer object associated with the dequeued buffer. Can be NULL
[out] shared_buffer Returns the shared NvBuffer object, if the queued buffer is being shared with other elements. Can be NULL.
[in] num_retries Number of times to try dequeuing a buffer before a failure is returned. In case of non-blocking mode, this is equivalent to the number of milliseconds to try to dequeue a buffer.
Returns:
0 for success, -1 for failure/timeout

Definition at line 116 of file NvV4l2ElementPlane.cpp.

void * NvV4l2ElementPlane::dqThread ( void *  v4l2_element_plane  )  [static, private]

The DQ thread function.

This function keeps on running infinitely till it is signalled to stop by stopDQThread or the dqThreadCallback function returns false. It keeps on trying to dequeue a buffer from the plane and calls the dqThreadCallback function on successful dequeue

Parameters:
[in] v4l2_element_plane Pointer to the NvV4l2ElementPlane object for which the thread has been started

Definition at line 710 of file NvV4l2ElementPlane.cpp.

int NvV4l2ElementPlane::exportBuffer ( uint32_t  buf_index  ) 

Export the buffer as DMABUF FD.

Warning:
This functions works only for V4L2_MEMORY_MMAP memory.
Calls VIDIOC_EXPBUF ioctl internally. Populates the fd member of all the NvBuffer::NvBufferPlane members of NvBuffer object at index buf_in.

Parameters:
[in] buf_index Index of the buffer to export
Returns:
0 for success, -1 for failure

Definition at line 556 of file NvV4l2ElementPlane.cpp.

enum v4l2_buf_type NvV4l2ElementPlane::getBufType (  )  [inline]

Get the streaming/buffer type of this plane.

Returns:
Type of the buffer belonging to enum v4l2_buf_type

Definition at line 237 of file NvV4l2ElementPlane.h.

int NvV4l2ElementPlane::getCrop ( struct v4l2_crop &  crop  ) 

Get the cropping rectangle for the plane.

Calls VIDIOC_G_CROP ioctl internally.

Parameters:
[in] crop Reference to v4l2_crop structure to be filled
Returns:
0 for success, -1 for failure

Definition at line 303 of file NvV4l2ElementPlane.cpp.

int NvV4l2ElementPlane::getFormat ( struct v4l2_format &  format  ) 

Get the plane format.

Calls VIDIOC_G_FMT ioctl internally.

Parameters:
[in,out] format Reference to v4l2_format structure to be filled
Returns:
0 for success, -1 for failure

Definition at line 268 of file NvV4l2ElementPlane.cpp.

NvBuffer * NvV4l2ElementPlane::getNthBuffer ( uint32_t  n  ) 

Get the NvBuffer object at index n.

Returns:
NvBuffer object at index n, NULL if n >= Number of buffers

Definition at line 104 of file NvV4l2ElementPlane.cpp.

uint32_t NvV4l2ElementPlane::getNumBuffers (  )  [inline]

Get the number of buffers allocated/requested on the plane.

Returns:
Number of buffers

Definition at line 289 of file NvV4l2ElementPlane.h.

uint32_t NvV4l2ElementPlane::getNumPlanes (  )  [inline]

Get the number of planes buffers on this plane contain for the currently set format.

Returns:
Number of planes

Definition at line 300 of file NvV4l2ElementPlane.h.

uint32_t NvV4l2ElementPlane::getNumQueuedBuffers (  )  [inline]

Get the number of buffers currently queued on the plane.

Returns:
number of buffers currently queued on the plane

Definition at line 326 of file NvV4l2ElementPlane.h.

bool NvV4l2ElementPlane::getStreamStatus (  ) 

Check if the plane is streaming.

Returns:
true if the plane is streaming, false otherwise.

Definition at line 494 of file NvV4l2ElementPlane.cpp.

uint32_t NvV4l2ElementPlane::getTotalDequeuedBuffers (  )  [inline]

Get the total number of buffers dequeued from the plane.

Returns:
total number of buffers dequeued from the plane

Definition at line 336 of file NvV4l2ElementPlane.h.

uint32_t NvV4l2ElementPlane::getTotalQueuedBuffers (  )  [inline]

Get the total number of buffers queued on the plane.

Returns:
total number of buffers queued on the plane

Definition at line 346 of file NvV4l2ElementPlane.h.

int NvV4l2ElementPlane::isInError (  )  [inline, private]

Indicates if the plane encountered an error during its operation.

Returns:
0 if no error was encountered, a non-zero value if an error was encountered.

Definition at line 513 of file NvV4l2ElementPlane.h.

void NvV4l2ElementPlane::operator= ( NvV4l2ElementPlane const &   )  [private]

Disallow assignment.

int NvV4l2ElementPlane::qBuffer ( struct v4l2_buffer &  v4l2_buf,
NvBuffer shared_buffer 
)

Queue a buffer on the plane.

This function calls VIDIOC_QBUF internally. If this plane is sharing buffer with other elements, the application can pass the pointer to the shared NvBuffer object in shared_buffer.

Parameters:
[in] v4l2_buf v4l2_buffer structure to be used for queueing
[in] shared_buffer Pointer to the shared NvBuffer object
Returns:
0 for success, -1 for failure/timeout

Definition at line 187 of file NvV4l2ElementPlane.cpp.

int NvV4l2ElementPlane::queryBuffer ( uint32_t  buf_index  ) 

Query the status of buffer at index.

Warning:
This functions works only for V4L2_MEMORY_MMAP memory.
Calls VIDIOC_QUERYBUF ioctl internally. Populates the length and mem_offset members of all the NvBuffer::NvBufferPlane members of the NvBuffer object at index buf_index.

Parameters:
[in] buf_index Index of the buffer to query
Returns:
0 for success, -1 for failure

Definition at line 519 of file NvV4l2ElementPlane.cpp.

int NvV4l2ElementPlane::reqbufs ( enum v4l2_memory  mem_type,
uint32_t  num 
)

Request for buffers on the plane.

Calls VIDIOC_REQBUFS ioctl internally. Creates an array of NvBuffer of length equal to the count returned by the ioctl.

Parameters:
[in] mem_type Type of V4L2 Memory to be requested
[in] num Number of buffers to request on the plane
Returns:
0 for success, -1 for failure

Definition at line 376 of file NvV4l2ElementPlane.cpp.

void NvV4l2ElementPlane::setBufferPlaneFormat ( int  n_planes,
NvBuffer::NvBufferPlaneFormat planefmts 
)

Set the format of the planes of the buffer which will be used with this plane.

The buffer plane format needs to be set before calling reqbufs, since these are needed by the NvBuffer constructor.

See also:
reqbufs
Parameters:
[in] n_planes Number of planes in the buffer
[in] planefmts Array of NvBufferPlaneFormat which describes the format of each of the plane. The array length should be at least n_planes.

Definition at line 338 of file NvV4l2ElementPlane.cpp.

bool NvV4l2ElementPlane::setDQThreadCallback ( dqThreadCallback  callback  ) 

Set the DQ Thread callback function.

The callback function is called from the DQ Thread once a buffer is successfully dequeued.

Parameters:
[in] callback Function to be called on succesful dequeue
Returns:
true for success, false for failure

Definition at line 701 of file NvV4l2ElementPlane.cpp.

int NvV4l2ElementPlane::setFormat ( struct v4l2_format &  format  ) 

Set the plane format.

Calls VIDIOC_S_FMT ioctl internally.

Parameters:
[in] format Reference to v4l2_format structure to be set on the plane
Returns:
0 for success, -1 for failure

Definition at line 276 of file NvV4l2ElementPlane.cpp.

int NvV4l2ElementPlane::setSelection ( uint32_t  target,
uint32_t  flags,
struct v4l2_rect &  rect 
)

Set the selection rectangle for the plane.

Calls VIDIOC_S_SELECTION ioctl internally.

Parameters:
[in] target Rectangle selection type
[in] flags Flags to control selection adjustments
[in] rect Selection rectangle
Returns:
0 for success, -1 for failure

Definition at line 312 of file NvV4l2ElementPlane.cpp.

int NvV4l2ElementPlane::setStreamParms ( struct v4l2_streamparm &  parm  ) 

Set streaming parameters.

Calls VIDIOC_S_PARM ioctl internally.

Parameters:
[in] parm Reference to v4l2_streamparm structure to be set on the plane
Returns:
0 for success, -1 for failure

Definition at line 500 of file NvV4l2ElementPlane.cpp.

int NvV4l2ElementPlane::setStreamStatus ( bool  status  ) 

Start or stop streaming on the plane.

Calls VIDIOC_STREAMON/VIDIOC_STREAMOFF ioctls internally.

Parameters:
[in] status Should be true to start stream, false to stop stream
Returns:
0 for success, -1 for failure

Definition at line 440 of file NvV4l2ElementPlane.cpp.

int NvV4l2ElementPlane::setupPlane ( enum v4l2_memory  mem_type,
uint32_t  num_buffers,
bool  map,
bool  allocate 
)

Helper function which encapsulates all the function calls required to setup the plane for streaming.

Calls reqbufs internally. Then, for each of the buffers calls queryBuffer, exportBuffer and maps the buffer/allocates the buffer memory depending on the memory type.

See also:
deinitPlane
Parameters:
[in] mem_type V4L2 Memory to use on the buffer
[in] num_buffers Number of buffer to request on the plane
[in] map boolean value indicating if the buffers should be mapped to memory (Only for V4L2_MEMORY_MMAP)
[in] allocate boolean valued indicating if the buffers should be allocated memory (Only for V4L2_MEMORY_USERPTR)
Returns:
0 for success, -1 for failure

Definition at line 588 of file NvV4l2ElementPlane.cpp.

int NvV4l2ElementPlane::startDQThread ( void *  data  ) 

Start DQ Thread.

This function starts a thread internally. On successful dequeue of a buffer from the plane, dqThreadCallback function set using setDQThreadCallback gets called.

Setting the stream to off will automatically stop the thread.

See also:
stopDQThread, waitForDQThread
Parameters:
[in] data Application data pointer. This is provided as an argument in the dqThreadCallback function
Returns:
0 for success, -1 for failure/timeout

Definition at line 768 of file NvV4l2ElementPlane.cpp.

int NvV4l2ElementPlane::stopDQThread (  ) 

Force stop the DQ Thread if it is running.

Does not work when the device has been opened in blocking mode.

See also:
startDQThread, waitForDQThread
Returns:
0 for success, -1 for failure/timeout

Definition at line 786 of file NvV4l2ElementPlane.cpp.

int NvV4l2ElementPlane::waitAllBuffersDequeued ( uint32_t  max_wait_ms  ) 

Wait till all the buffers of the plane get dequeued.

This is a blocking call which returns when all the buffers get dequeued or timeout is reached.

Parameters:
[in] max_wait_ms Maximum time to wait in milliseconds
Returns:
0 for success, -1 for failure/timeout

Definition at line 672 of file NvV4l2ElementPlane.cpp.

int NvV4l2ElementPlane::waitAllBuffersQueued ( uint32_t  max_wait_ms  ) 

Wait till all the buffers of the plane get queued.

This is a blocking call which returns when all the buffers get queued or timeout is reached.

Parameters:
[in] max_wait_ms Maximum time to wait in milliseconds
Returns:
0 for success, -1 for failure/timeout

Definition at line 642 of file NvV4l2ElementPlane.cpp.

int NvV4l2ElementPlane::waitForDQThread ( uint32_t  max_wait_ms  ) 

Wait for the DQ Thread to stop.

This function waits till the DQ Thread stops or timeout is reached

See also:
startDQThread, stopDQThread
Parameters:
[in] max_wait_ms 
Returns:
0 for success, -1 for failure/timeout

Definition at line 801 of file NvV4l2ElementPlane.cpp.


Friends And Related Function Documentation

friend class NvV4l2Element [friend]

Definition at line 551 of file NvV4l2ElementPlane.h.


Member Data Documentation

Whether the V4l2 element has been opened with blocking mode.

Definition at line 455 of file NvV4l2ElementPlane.h.

enum v4l2_buf_type NvV4l2ElementPlane::buf_type [private]

Type of the stream.

Definition at line 453 of file NvV4l2ElementPlane.h.

Array of NvBuffer object pointers.

This array is allocated and initialized in reqbufs.

Definition at line 460 of file NvV4l2ElementPlane.h.

Callback function used by the DQ Thread.

Definition at line 486 of file NvV4l2ElementPlane.h.

const char* NvV4l2ElementPlane::comp_name [private]

Specifies the name of the component, for debugging.

Definition at line 548 of file NvV4l2ElementPlane.h.

pthread_t NvV4l2ElementPlane::dq_thread [private]

pthread ID of the DQ Thread

Definition at line 484 of file NvV4l2ElementPlane.h.

Application supplied pointer provided as an argument in dqThreadCallback.

Definition at line 488 of file NvV4l2ElementPlane.h.

Boolean indicating if the DQ Thread is running.

Its value is toggled by the DQ Thread

Definition at line 480 of file NvV4l2ElementPlane.h.

int& NvV4l2ElementPlane::fd [private]

FD of the V4l2 Element the plane is associated with.

Definition at line 448 of file NvV4l2ElementPlane.h.

Indicates if an error was encountered during the operation of the element.

Definition at line 546 of file NvV4l2ElementPlane.h.

enum v4l2_memory NvV4l2ElementPlane::memory_type [private]

V4l2 memory type of the buffers.

Definition at line 469 of file NvV4l2ElementPlane.h.

uint8_t NvV4l2ElementPlane::n_planes [private]

Number of planes in the buffers.

Definition at line 463 of file NvV4l2ElementPlane.h.

uint32_t NvV4l2ElementPlane::num_buffers [private]

Number of buffers returned by VIDIOC_REQBUFS ioctl.

Definition at line 458 of file NvV4l2ElementPlane.h.

Number of buffers currently queued on the plane.

Definition at line 471 of file NvV4l2ElementPlane.h.

Plane condition which application can wait on to receive notifications from qBuffer/dqBuffer.

Definition at line 443 of file NvV4l2ElementPlane.h.

Mutex lock used along with plane_cond.

Definition at line 442 of file NvV4l2ElementPlane.h.

const char* NvV4l2ElementPlane::plane_name [private]

Name of the plane.

Could be "Output Plane" or "Capture Plane". Used only for debug logs

Definition at line 450 of file NvV4l2ElementPlane.h.

Format of the buffer planes.

This should be initialized before calling reqbufs since this is required by the NvBuffer constructor

Definition at line 465 of file NvV4l2ElementPlane.h.

Boolean value used to signal the DQ Thread to stop.

Definition at line 482 of file NvV4l2ElementPlane.h.

Boolean indicating if the plane is streaming.

Definition at line 478 of file NvV4l2ElementPlane.h.

Total number of buffers dequeued from the plane.

Definition at line 475 of file NvV4l2ElementPlane.h.

Total number of buffers queued on the plane.

Definition at line 473 of file NvV4l2ElementPlane.h.

A reference to the profiler belonging to the plane's parent element.

Definition at line 504 of file NvV4l2ElementPlane.h.


The documentation for this class was generated from the following files:

Generated on Wed Nov 9 19:52:25 2016 for NVIDIA Tegra Multimedia API Framework by  doxygen 1.5.8