{
GstSample *sample;
gchar *sum;
- GstMapInfo map;
GstBuffer *buffer;
const gchar *target_sum;
+ guint64 frame_number;
GstValidateExecuteActionReturn res = GST_VALIDATE_EXECUTE_ACTION_OK;
+ GstVideoTimeCodeMeta *tc_meta;
g_object_get (sink, "last-sample", &sample, NULL);
if (sample == NULL) {
}
buffer = gst_sample_get_buffer (sample);
- if (!gst_buffer_map (buffer, &map, GST_MAP_READ)) {
- GST_VALIDATE_REPORT (scenario, SCENARIO_ACTION_EXECUTION_ERROR,
- "Last sample buffer could not be mapped, action can't run.");
+ target_sum = gst_structure_get_string (action->structure, "checksum");
+ if (target_sum) {
+ GstMapInfo map;
+
+ if (!gst_buffer_map (buffer, &map, GST_MAP_READ)) {
+ GST_VALIDATE_REPORT_ACTION (scenario, action,
+ SCENARIO_ACTION_EXECUTION_ERROR,
+ "Last sample buffer could not be mapped, action can't run.");
+ res = GST_VALIDATE_EXECUTE_ACTION_ERROR_REPORTED;
+ goto done;
+ }
+ sum = g_compute_checksum_for_data (G_CHECKSUM_SHA1, map.data, map.size);
+ gst_buffer_unmap (buffer, &map);
+
+ if (g_strcmp0 (sum, target_sum)) {
+ GST_VALIDATE_REPORT_ACTION (scenario, action,
+ SCENARIO_ACTION_EXECUTION_ERROR,
+ "Last buffer checksum '%s' is different than the expected one: '%s'",
+ sum, target_sum);
+
+ res = GST_VALIDATE_EXECUTE_ACTION_ERROR_REPORTED;
+ }
+ g_free (sum);
+
goto done;
}
- sum = g_compute_checksum_for_data (G_CHECKSUM_SHA1, map.data, map.size);
- gst_buffer_unmap (buffer, &map);
+ if (!gst_structure_get_uint64 (action->structure, "timecode-frame-number",
+ &frame_number)) {
+ gint iframe_number;
- target_sum = gst_structure_get_string (action->structure, "checksum");
- if (g_strcmp0 (sum, target_sum)) {
+ if (!gst_structure_get_int (action->structure, "timecode-frame-number",
+ &iframe_number)) {
+ GST_VALIDATE_REPORT_ACTION (scenario, action,
+ SCENARIO_ACTION_EXECUTION_ERROR,
+ "The 'checksum' or 'time-code-frame-number' parametters of the "
+ "`check-last-sample` action type needs to be specified, none found");
+
+ res = GST_VALIDATE_EXECUTE_ACTION_ERROR_REPORTED;
+ goto done;
+ }
+
+ frame_number = (guint64) iframe_number;
+ }
+
+ tc_meta = gst_buffer_get_video_time_code_meta (buffer);
+ if (!tc_meta) {
GST_VALIDATE_REPORT (scenario, SCENARIO_ACTION_EXECUTION_ERROR,
- "Last buffer checksum '%s' is different than the expected one: '%s'",
- sum, target_sum);
+ "Could not \"check-last-sample\" as the buffer doesn' contain a TimeCode"
+ " meta");
+ res = GST_VALIDATE_EXECUTE_ACTION_ERROR_REPORTED;
+ goto done;
+ }
+ if (gst_video_time_code_frames_since_daily_jam (&tc_meta->tc) != frame_number) {
+ GST_VALIDATE_REPORT (scenario, SCENARIO_ACTION_EXECUTION_ERROR,
+ "Last buffer frame number '%" G_GINT64_FORMAT
+ "' is different than the expected one: '%" G_GINT64_FORMAT "'",
+ gst_video_time_code_frames_since_daily_jam (&tc_meta->tc),
+ frame_number);
res = GST_VALIDATE_EXECUTE_ACTION_ERROR_REPORTED;
}
- g_free (sum);
done:
return res;
if (!gst_pad_send_event (pad, event)) {
- GST_VALIDATE_REPORT (scenario, SCENARIO_ACTION_EXECUTION_ERROR,
+ GST_VALIDATE_REPORT_ACTION (scenario, action,
+ SCENARIO_ACTION_EXECUTION_ERROR,
"Could not send \"force key unit\" event %s", direction);
goto fail;
}
{
.name = "checksum",
.description = "The reference checksum of the buffer.",
- .mandatory = TRUE,
+ .mandatory = FALSE,
+ .types = "string",
+ NULL
+ },
+ {
+ .name = "timecode-frame-number",
+ .description = "The frame number of the buffer as specified on its"
+ " GstVideoTimeCodeMeta",
+ .mandatory = FALSE,
.types = "string",
NULL
},
{NULL}
}),
- "Checks the last-sample checksum or embedded frame number on declared Sink element."
- " This allows checking the checksum of a buffer after a 'seek' or after a GESTimeline 'commit'"
+ "Checks the last-sample checksum or frame number (set on its "
+ " GstVideoTimeCodeMeta) on declared Sink element."
+ " This allows checking the checksum of a buffer after a 'seek' or after a"
+ " GESTimeline 'commit'"
" for example",
GST_VALIDATE_ACTION_TYPE_INTERLACED);