return VISION_SOURCE_ERROR_NONE;
}
+static int __convert_buffer_to_fmt(vision_source_buffer_s *buffer,
+ media_format_h fmt)
+{
+ media_format_mimetype_e mime;
+ switch (buffer->pixel_format) {
+ case VISION_SOURCE_PIXEL_FORMAT_RGB24:
+ mime = MEDIA_FORMAT_RGB888;
+ break;
+
+ default:
+ LOGE("Not supported format %d", buffer->pixel_format);
+ return VISION_SOURCE_ERROR_INVALID_PARAMETER;
+ }
+ if (media_format_set_video_mime(fmt, mime) != MEDIA_FORMAT_ERROR_NONE)
+ return VISION_SOURCE_ERROR_INTERNAL;
+ media_format_set_video_width(fmt, buffer->resolution.width);
+ media_format_set_video_height(fmt, buffer->resolution.height);
+
+ return VISION_SOURCE_ERROR_NONE;
+}
+
+static void __pkt_dispose_cb(media_packet_h packet, void *user_data)
+{
+ packet_context_s *pkt_ctx = (packet_context_s *) user_data;
+ if (__vision_source_v4l2_qbuf(pkt_ctx->device_fd, pkt_ctx->type,
+ pkt_ctx->memory,
+ pkt_ctx->index) != VISION_SOURCE_ERROR_NONE) {
+ LOGE("qbuf failed with device_fd: %d, type: %d, memory: %d, index: %d",
+ pkt_ctx->device_fd, pkt_ctx->type, pkt_ctx->memory,
+ pkt_ctx->index);
+ }
+
+ free(pkt_ctx);
+}
+
+static media_packet_h __make_media_packet(vision_source_buffer_s *buffer,
+ int device_fd, int buffer_type,
+ int index)
+{
+ media_packet_h pkt;
+ media_format_h fmt;
+ media_format_create(&fmt);
+ if (__convert_buffer_to_fmt(buffer, fmt) != VISION_SOURCE_ERROR_NONE) {
+ media_format_unref(fmt);
+ return NULL;
+ }
+
+ packet_context_s *pkt_ctx =
+ (packet_context_s *) malloc(sizeof(packet_context_s));
+ if (!pkt_ctx) {
+ LOGE("packet_context_s malloc failed");
+ media_format_unref(fmt);
+ return NULL;
+ }
+
+ pkt_ctx->device_fd = device_fd;
+ pkt_ctx->type = buffer_type;
+ pkt_ctx->memory = V4L2_MEMORY_MMAP;
+ pkt_ctx->index = index;
+
+ media_packet_new_from_external_memory(fmt, buffer->planes[0].data,
+ buffer->planes[0].used_size,
+ __pkt_dispose_cb, pkt_ctx, &pkt);
+
+ media_format_unref(fmt);
+ return pkt;
+}
+
static void *__fetch_buffer_and_callback(gpointer data)
{
vision_source_v4l2_s *v4l2_handle = (vision_source_v4l2_s *) data;
break;
}
g_mutex_unlock(&v4l2_handle->buffer_lock);
- v4l2_handle->vision_source_buffers[index].planes[0].used_size =
- byte_size;
+ vision_source_buffer_s *buffer =
+ &v4l2_handle->vision_source_buffers[index];
+ buffer->planes[0].used_size = byte_size;
if (v4l2_handle->stream_callback) {
- v4l2_handle->stream_callback(
- &v4l2_handle->vision_source_buffers[index],
- v4l2_handle->stream_callback_data);
- }
- if (__vision_source_v4l2_qbuf(
- v4l2_handle->device_fd, v4l2_handle->buffer_type,
- V4L2_MEMORY_MMAP, index) != VISION_SOURCE_ERROR_NONE) {
- LOGE("qbuf failed");
- g_mutex_lock(&v4l2_handle->buffer_lock);
- break;
+ media_packet_h pkt =
+ __make_media_packet(buffer, v4l2_handle->device_fd,
+ v4l2_handle->buffer_type, index);
+ if (!pkt)
+ return NULL;
+ v4l2_handle->stream_callback(pkt,
+ v4l2_handle->stream_callback_data);
+ media_packet_unref(pkt);
}
sched_yield();
EXPECT_EQ(vision_source_stop_stream(ms_handle), VISION_SOURCE_ERROR_NONE);
}
-static int test_cb(vision_source_buffer_s *buffer, void *user_data)
+static int test_cb(media_packet_h pkt, void *user_data)
{
FILE *file;
clock_t end = clock();
snprintf(filename, 127, "out_%04u.data", (unsigned) delta_ms);
file = fopen(filename, "w");
-
- fwrite(buffer->planes[0].data, sizeof(unsigned char),
- buffer->planes[0].used_size, file);
+ if (!file)
+ return VISION_SOURCE_ERROR_INTERNAL;
+
+ char *data;
+ uint64_t size;
+ media_packet_get_buffer_data_ptr(pkt, (void **) &data);
+ media_packet_get_buffer_size(pkt, &size);
+ fwrite(data, sizeof(unsigned char), size, file);
fclose(file);
return 0;
}