Hi,NVIDIA:
I have wrote a sample to capture yuv image accroding to the sample of oneShot.
Here is the main code:
EGLStream::Image *image = iFrame->getImage();
EXIT_IF_NULL(image, “Failed to get Image from iFrame->getImage()”);
EGLStream::IImageHeaderlessFile *iHeaderlessFile = Argus::interface_castEGLStream::IImageHeaderlessFile (image);
if (!iHeaderlessFile)
{
EXIT_IF_NULL(iHeaderlessFile,“Devil : --------------------------- Failed to get IImageHeaderlessFile interface.\n”);
}
status = iHeaderlessFile->writeHeaderlessFile(FILE_PREFIX “devil_yuv.yuv”);
EXIT_IF_NOT_OK(status,“Devil : ---------------------------- faileed to write yuv \n”)
printf("Devil : --------- " FILE_PREFIX “devil_yuv.yuv\n”);
Also,I wanted to dump the yuv buffer as below:
char buf[128];
printf("\n buffer count : %d \n buffer size : %d",iImage->getBufferCount(),iImage->getBufferSize());
snprintf(buf,sizeof(buf),"/home/image-3261//fDocumentsrame%d.yuv",requestId);
int devil_fd = open(buf,O_RDWR|O_CREAT,0777);
if(devil_fd){
int length = write(devil_fd,iImage->mapBuffer(5),1280720 3/2);
close(devil_fd);
}else{
printf(“Devil : fd is null”);
}
But the buffer I dumped can’t be recognized as a yuv image.Is there any error with my code or process?
Have reference to argus_camera to capture the headless(nv12) files.
I have capture the headless file successfully, but I want to get the yuv buffer not only capture a image.I use the mapbuffer function to get the buffer,but it occurs some question.The buffer I saved to a file couldn’t be recognized as a yuv image.
Have a check the yuvJpeg sample code.
// Print out some capture metadata from the frame.
IArgusCaptureMetadata *iArgusCaptureMetadata = interface_cast<IArgusCaptureMetadata>(frame);
if (!iArgusCaptureMetadata)
ORIGINATE_ERROR("Failed to get IArgusCaptureMetadata interface.");
CaptureMetadata *metadata = iArgusCaptureMetadata->getMetadata();
ICaptureMetadata *iMetadata = interface_cast<ICaptureMetadata>(metadata);
if (!iMetadata)
ORIGINATE_ERROR("Failed to get ICaptureMetadata interface.");
CONSUMER_PRINT("\tSensor Timestamp: %llu, LUX: %f\n",
static_cast<unsigned long long>(iMetadata->getSensorTimestamp()),
iMetadata->getSceneLux());
// Print out image details, and map the buffers to read out some data.
Image *image = iFrame->getImage();
IImage *iImage = interface_cast<IImage>(image);
IImage2D *iImage2D = interface_cast<IImage2D>(image);
for (uint32_t i = 0; i < iImage->getBufferCount(); i++)
{
const uint8_t *d = static_cast<const uint8_t*>(iImage->mapBuffer(i));
if (!d)
ORIGINATE_ERROR("\tFailed to map buffer\n");
Size2D<uint32_t> size = iImage2D->getSize(i);
CONSUMER_PRINT("\tIImage(2D): "
"buffer %u (%ux%u, %u stride), "
"%02x %02x %02x %02x %02x %02x %02x %02x %02x %02x %02x %02x\n",
i, size.width(), size.height(), iImage2D->getStride(i),
d[0], d[1], d[2], d[3], d[4], d[5],
d[6], d[7], d[8], d[9], d[10], d[11]);
}
Hi,Shane:
I have print the info as below:
Capturing from device 0 using sensor mode 4 (1280x720)
count : 2
Devil :
count : 0
height : 720
width : 1280
stride : 1280
Devil :
count : 1
height : 360
width : 640
stride : 1280
buffer count : 2
And I saved buffer with iImage->mapbuffer(1) as a yuv file, but I can’t preview normal picture in this file.
Could you please share the source code of WriteHeadlessFile() or tell me how to save yuv image from the buffer?
DaneLLL
November 10, 2021, 8:37am
#9
Hi,
Please check the sample and do modification:
/usr/src/jetson_multimedia_api/samples/09_camera_jpeg_capture
The default code is
if (m_dmabuf == -1)
{
m_dmabuf = iNativeBuffer->createNvBuffer(iStream->getResolution(),
NvBufferColorFormat_YUV420,
NvBufferLayout_BlockLinear);
if (m_dmabuf == -1)
CONSUMER_PRINT("\tFailed to create NvBuffer\n");
}
else if (iNativeBuffer->copyToNvBuffer(m_dmabuf) != STATUS_OK)
{
ORIGINATE_ERROR("Failed to copy frame to NvBuffer.");
}
Please modify NvBufferLayout_BlockLinear
to NvBufferLayout_Pitch
and then you can dump the frames with following code:
char filename[256];
sprintf(filename,"output000.yuv",(unsigned)frameNumber);
std::ofstream *outputFile = new std::ofstream(filename);
dump_dmabuf(m_dmabuf,0,outputFile);
dump_dmabuf(m_dmabuf,1,outputFile);
dump_dmabuf(m_dmabuf,2,outputFile);
delete outputFile;
I have dumped the buffer successfully.
Thanks a lot.
Hi,Dane
What does the plane of “1”,“2”,“3” mean?
Is the plane 1 corresponding Y buffer,2 corresponding U buffer and 3 corresponding V buffer?
I use the NvBufferParams to get the num_planes is 3,but I still would like to know what does each plane mean.
DaneLLL
November 15, 2021, 5:58am
#14
Hi,
932315769:
What does the plane of “1”,“2”,“3” mean?
Is the plane 1 corresponding Y buffer,2 corresponding U buffer and 3 corresponding V buffer?
Yes, this is correct. For NvBufferColorFormat_YUV420, there are 3 planes, in Y, U, and V planes.
system
closed
December 8, 2021, 3:18am
#17
This topic was automatically closed 14 days after the last reply. New replies are no longer allowed.