19 #include <cuda_runtime_api.h>
22 #include "data_feeder.hpp"
26 class FileDataSource :
public DataFeeder::IDataProvider {
41 fp_ = fopen(location.c_str(),
"r");
43 fprintf(stderr,
"Failed to open file %s\n", location.c_str());
50 bool use_gpu_memory =
false;
51 bool use_external_memory =
true;
57 "use-gpu-memory", use_gpu_memory,
"use-external-memory", use_external_memory,
58 "frame-width", width,
"frame-height", height,
"format",
format,
60 unsigned int frame_size = 0;
63 frame_size = width*height*4;
66 frame_size = width*height*1.5;
70 use_gpu_memory =
false;
72 if (frame_size <= 0) {
73 fprintf(stderr,
"Invalid frame size %u\n", frame_size);
75 }
else if (frame_size > size) {
77 fprintf(stderr,
"Frame size is larger than asked %u vs %u\n", frame_size, size);
82 if (buffer_ ==
nullptr) {
83 buffer_ = malloc(frame_size);
85 if (0 == fread (buffer_, 1, frame_size, fp_))
break;
86 if (use_external_memory) {
87 void *cuda_device_data;
88 if (cudaMalloc ((
void **) &cuda_device_data, frame_size) != cudaSuccess) {
89 fprintf(stderr,
"ERROR !! Unable to allocate device memory. \n");
92 if (cudaMemcpy (cuda_device_data, buffer_, frame_size,
93 cudaMemcpyHostToDevice) != cudaSuccess) {
94 fprintf(stderr,
"Unable to copy between device and host memories. \n");
101 [&](
void* data,
size_t len) {
102 if (len != frame_size) {
105 cudaMemcpy(data, buffer_, len, cudaMemcpyHostToDevice);
112 if (use_external_memory) {
113 void* data = malloc(frame_size);
114 if (0 == fread (data, 1, frame_size, fp_))
break;
115 return Buffer(frame_size, data);
117 Buffer buffer(frame_size);
119 [&](
void* data,
size_t len){
120 return fread (data, 1, frame_size, fp_);
133 void* buffer_ =
nullptr;