}
}
-MetadataFileHandle::MetadataFileHandle(int id) : handle_(nullptr), id_(id) {
+MetadataFileHandle::MetadataFileHandle(int id) : handle_(nullptr), id_(id), width_(0), height_(0) {
ScopeLogger();
}
// 'this' owns a handle_, and uri_ and invalidates 'o'
MetadataFileHandle::MetadataFileHandle(MetadataFileHandle&& o)
- : handle_(nullptr), id_(o.id_), uri_(std::move(o.uri_)) {
+ : handle_(nullptr), id_(o.id_), uri_(std::move(o.uri_)), width_(0), height_(0) {
ScopeLogger();
handle_ = o.handle_;
o.handle_ = nullptr;
o.handle_ = nullptr;
id_ = o.id_;
uri_ = std::move(o.uri_);
+ width_ = o.width_;
+ height_ = o.height_;
return *this;
}
return PlatformResult(ErrorCode::NO_ERROR);
}
-// convert frame buffer from raw RGB888 to JPG encoding
-PlatformResult MetadataFileHandle::EncodeJPEG(unsigned char* frame, size_t frame_size,
- std::uint8_t** uint8_frame, size_t* buffer_size) {
- ScopeLogger();
- image_util_type_e encoder_type = IMAGE_UTIL_JPEG;
- image_util_encode_h encode_handle = nullptr;
- image_util_image_h image = nullptr;
- SCOPE_EXIT {
- image_util_encode_destroy(encode_handle);
- image_util_destroy_image(image);
- };
-
- int ret = image_util_encode_create(encoder_type, &encode_handle);
- if (IMAGE_UTIL_ERROR_NONE != ret) {
- LoggerE("Error during jpg encoding: %d", ret);
- return convertErrorCode(ret);
+PlatformResult MetadataFileHandle::InitWidthHeight() {
+ if (width_ != 0 && height_ != 0) {
+ LoggerD("Size already initialized");
+ return PlatformResult(ErrorCode::NO_ERROR);
}
char* value = nullptr;
LoggerE("Error during getting metadata: %d", native_res);
return convertErrorCode(native_res);
}
- unsigned int width = (unsigned long)atoi(value);
+ width_ = (unsigned long)atoi(value);
free(value);
value = nullptr;
LoggerE("Error during getting metadata: %d", native_res);
return convertErrorCode(native_res);
}
- unsigned int height = (unsigned long)atoi(value);
+ height_ = (unsigned long)atoi(value);
free(value);
value = nullptr;
- ret = image_util_create_image(width, height, IMAGE_UTIL_COLORSPACE_RGB888, frame, frame_size,
+ return PlatformResult(ErrorCode::NO_ERROR);
+}
+
+// convert frame buffer from raw RGB888 to JPG encoding
+PlatformResult MetadataFileHandle::EncodeJPEG(unsigned char* frame, size_t frame_size,
+ std::uint8_t** uint8_frame, size_t* buffer_size) {
+ ScopeLogger();
+ image_util_type_e encoder_type = IMAGE_UTIL_JPEG;
+ image_util_encode_h encode_handle = nullptr;
+ image_util_image_h image = nullptr;
+ SCOPE_EXIT {
+ image_util_encode_destroy(encode_handle);
+ image_util_destroy_image(image);
+ };
+
+ PlatformResult res = InitWidthHeight();
+ if (!res) {
+ return res;
+ }
+
+ int ret = image_util_encode_create(encoder_type, &encode_handle);
+ if (IMAGE_UTIL_ERROR_NONE != ret) {
+ LoggerE("Error during jpg encoding: %d", ret);
+ return convertErrorCode(ret);
+ }
+
+ ret = image_util_create_image(width_, height_, IMAGE_UTIL_COLORSPACE_RGB888, frame, frame_size,
&image);
if (IMAGE_UTIL_ERROR_NONE != ret) {
LoggerE("Error during jpg encoding: %d", ret);
return PlatformResult(ErrorCode::NO_ERROR);
}
+PlatformResult MetadataFileHandle::GetFrame(const unsigned long timestamp, const bool is_accurate,
+ std::vector<std::uint8_t>* frame_array) {
+ ScopeLogger();
+ int size = 0;
+ size_t buffer_size = 0;
+ void* frame = nullptr;
+ char* mime_type = nullptr;
+ std::uint8_t* uint8_frame = nullptr;
+ SCOPE_EXIT {
+ free(frame);
+ free(mime_type);
+ free(uint8_frame);
+ };
+
+ int native_res =
+ metadata_extractor_get_frame_at_time(handle_, timestamp, is_accurate, &frame, &size);
+ if (METADATA_EXTRACTOR_ERROR_NONE != native_res) {
+ LoggerE("Error during getting metadata: %d", native_res);
+ return convertErrorCode(native_res);
+ }
+ LoggerD("Frame size %d", size);
+
+ // encode as JPEG
+ auto ret = EncodeJPEG((unsigned char*)frame, (size_t)size, &uint8_frame, &buffer_size);
+ if (!ret) {
+ return ret;
+ }
+
+ // convert frame to vector
+ std::vector<std::uint8_t> out_buf(uint8_frame, uint8_frame + buffer_size);
+
+ *frame_array = std::move(out_buf);
+ return PlatformResult(ErrorCode::NO_ERROR);
+}
+
} // namespace metadata
} // namespace extension
REGISTER_METHOD(MetadataFileHandleGet);
REGISTER_METHOD(MetadataFileHandleGetArtwork);
REGISTER_METHOD(MetadataFileHandleGetThumbnailFrame);
+ REGISTER_METHOD(MetadataFileHandleGetFrameAtTime);
REGISTER_METHOD(MetadataFileHandleRelease);
#undef REGISTER_METHOD
}
ReportSuccess(picojson::value(result_artwork), out);
}
+void MetadataInstance::MetadataFileHandleGetFrameAtTime(const picojson::value& args,
+ picojson::object& out) {
+ ScopeLogger();
+ const std::string& uri = args.get("uri").get<std::string>();
+ const int id = static_cast<int>(args.get("id").get<double>());
+ const unsigned long timestamp = static_cast<unsigned long>(args.get("timestamp").get<double>());
+ const bool is_accurate = args.get("isAccurate").get<bool>();
+
+ auto res = InitializeHandleIfNeeded(uri, id);
+ if (!res) {
+ LogAndReportError(res, &out);
+ return;
+ }
+
+ std::vector<std::uint8_t> data;
+ std::string mime_type;
+ try {
+ MetadataFileHandle& m = handles_map_.at(id);
+
+ auto res = m.GetFrame(timestamp, is_accurate, &data);
+ if (!res) {
+ LogAndReportError(res, &out);
+ return;
+ }
+ } catch (...) {
+ // this should never happen
+ LogAndReportError(
+ PlatformResult(ErrorCode::ABORT_ERR, "Unknown error during accessing a file."), &out);
+ return;
+ }
+
+ std::string result_frame;
+ encode_binary_in_string(data, result_frame);
+
+ ReportSuccess(picojson::value(result_frame), out);
+}
+
void MetadataInstance::MetadataFileHandleRelease(const picojson::value& args,
picojson::object& out) {
ScopeLogger();