Skip to content
Snippets Groups Projects
Commit 789fc28f authored by Simon Ser's avatar Simon Ser
Browse files

lib/igt_chamelium: add support for GetLastInfoFrame


This new call retrieves the last InfoFrame received by the Chamelium board.

Signed-off-by: default avatarSimon Ser <simon.ser@intel.com>
Reviewed-by: default avatarMartin Peres <martin.peres@linux.intel.com>
parent e9c94e69
No related branches found
No related tags found
No related merge requests found
......@@ -1124,6 +1124,63 @@ int chamelium_get_captured_frame_count(struct chamelium *chamelium)
return ret;
}
bool chamelium_supports_get_last_infoframe(struct chamelium *chamelium)
{
return chamelium_supports_method(chamelium, "GetLastInfoFrame");
}
static const char *
chamelium_infoframe_type_str(enum chamelium_infoframe_type type)
{
switch (type) {
case CHAMELIUM_INFOFRAME_AVI:
return "avi";
case CHAMELIUM_INFOFRAME_AUDIO:
return "audio";
case CHAMELIUM_INFOFRAME_MPEG:
return "mpeg";
case CHAMELIUM_INFOFRAME_VENDOR:
return "vendor";
}
assert(0); /* unreachable */
}
struct chamelium_infoframe *
chamelium_get_last_infoframe(struct chamelium *chamelium,
struct chamelium_port *port,
enum chamelium_infoframe_type type)
{
xmlrpc_value *res, *res_version, *res_payload;
struct chamelium_infoframe *infoframe;
const unsigned char *payload;
res = chamelium_rpc(chamelium, NULL, "GetLastInfoFrame", "(is)",
port->id, chamelium_infoframe_type_str(type));
xmlrpc_struct_find_value(&chamelium->env, res, "version", &res_version);
xmlrpc_struct_find_value(&chamelium->env, res, "payload", &res_payload);
infoframe = calloc(1, sizeof(*infoframe));
xmlrpc_read_int(&chamelium->env, res_version, &infoframe->version);
xmlrpc_read_base64(&chamelium->env, res_payload,
&infoframe->payload_size, &payload);
/* xmlrpc-c's docs say payload is actually not constant */
infoframe->payload = (uint8_t *) payload;
xmlrpc_DECREF(res_version);
xmlrpc_DECREF(res_payload);
xmlrpc_DECREF(res);
if (infoframe->payload_size == 0) {
chamelium_infoframe_destroy(infoframe);
return NULL;
}
return infoframe;
}
void chamelium_infoframe_destroy(struct chamelium_infoframe *infoframe)
{
free(infoframe->payload);
free(infoframe);
}
bool chamelium_has_audio_support(struct chamelium *chamelium,
struct chamelium_port *port)
{
......
......@@ -65,6 +65,19 @@ struct chamelium_audio_file {
int channels;
};
enum chamelium_infoframe_type {
CHAMELIUM_INFOFRAME_AVI,
CHAMELIUM_INFOFRAME_AUDIO,
CHAMELIUM_INFOFRAME_MPEG,
CHAMELIUM_INFOFRAME_VENDOR,
};
struct chamelium_infoframe {
int version;
size_t payload_size;
uint8_t *payload;
};
struct chamelium_edid;
/**
......@@ -141,6 +154,11 @@ void chamelium_start_capture(struct chamelium *chamelium,
void chamelium_stop_capture(struct chamelium *chamelium, int frame_count);
void chamelium_capture(struct chamelium *chamelium, struct chamelium_port *port,
int x, int y, int w, int h, int frame_count);
bool chamelium_supports_get_last_infoframe(struct chamelium *chamelium);
struct chamelium_infoframe *
chamelium_get_last_infoframe(struct chamelium *chamelium,
struct chamelium_port *port,
enum chamelium_infoframe_type type);
bool chamelium_has_audio_support(struct chamelium *chamelium,
struct chamelium_port *port);
void chamelium_get_audio_channel_mapping(struct chamelium *chamelium,
......@@ -185,5 +203,6 @@ void chamelium_crop_analog_frame(struct chamelium_frame_dump *dump, int width,
int height);
void chamelium_destroy_frame_dump(struct chamelium_frame_dump *dump);
void chamelium_destroy_audio_file(struct chamelium_audio_file *audio_file);
void chamelium_infoframe_destroy(struct chamelium_infoframe *infoframe);
#endif /* IGT_CHAMELIUM_H */
0% Loading or .
You are about to add 0 people to the discussion. Proceed with caution.
Finish editing this message first!
Please register or to comment