bool sendPreview() { if(camera != nullptr && camera->getLiveImage(&image)) { bool keyFrame = false; bool transcodedSuccessfully = false; imagePub.publish(image); jpegDecoder->decodeInPlace(&image); liveStream->addFrame(&image); recorder->addFrame(&image); if (detector != nullptr) { detector->addFrame(&image); } return true; } return false; }
int main(int argc, char **argv) { // XXX: Assumes that the input image 1600x1200 PixelFormat pixelFormat = PIX_FMT_YUV420P; JpegDecoder *jpegDecoder = new FFmpegJpegDecoder(1600, 1200, pixelFormat); sensor_msgs::CompressedImage image; image.format = "jpeg"; std::string path(argv[1]); std::fstream f(path, std::ifstream::binary | std::ios_base::in); if (!f) { std::cout << "Failed to open " << path << std::endl; return 1; } f.seekg(0, f.end); int length = f.tellg(); f.seekg(0, f.beg); char *buffer = new char[length]; f.read(buffer, length); f.close(); for (int i = 0; i < length; i++) { image.data.push_back(buffer[i]); } delete buffer; sensor_msgs::CompressedImage images[10]; for (int i = 0; i < 10; i++) { images[i] = image; } int junk = 0; std::chrono::steady_clock::time_point start = std::chrono::steady_clock::now(); for (int i = 0; i < 10; i++) { jpegDecoder->decodeInPlace(&images[i]); // Make sure there's a side effect junk += images[i].data.size(); } std::chrono::steady_clock::time_point end = std::chrono::steady_clock::now(); double us = std::chrono::duration_cast<std::chrono::microseconds>(end - start).count() / 1000000.0; std::cout << "FFmpeg FPS " << 10 / us << std::endl; std::cout << "check: " << junk << std::endl; delete jpegDecoder; jpegDecoder = new TurboJpegDecoder(1600, 1200, pixelFormat); for (int i = 0; i < 10; i++) { images[i] = image; } junk = 0; start = std::chrono::steady_clock::now(); for (int i = 0; i < 10; i++) { jpegDecoder->decodeInPlace(&images[i]); // Make sure there's a side effect junk += images[i].data.size(); } end = std::chrono::steady_clock::now(); us = std::chrono::duration_cast<std::chrono::microseconds>(end - start).count() / 1000000.0; std::cout << "TurboJpeg FPS " << 10 / us << std::endl; std::cout << "check: " << junk << std::endl; delete jpegDecoder; return 0; }