mirror of
https://gitlab.freedesktop.org/gstreamer/gstreamer.git
synced 2024-12-29 11:40:38 +00:00
118 lines
3.3 KiB
C
118 lines
3.3 KiB
C
|
/*
|
||
|
* GStreamer AVTP Plugin
|
||
|
* Copyright (C) 2019 Intel Corporation
|
||
|
*
|
||
|
* This library is free software; you can redistribute it and/or
|
||
|
* modify it under the terms of the GNU Library General Public
|
||
|
* License as published by the Free Software Foundation; either
|
||
|
* version 2 of the License, or (at your option) any later version.
|
||
|
*
|
||
|
* This library is distributed in the hope that it will be useful,
|
||
|
* but WITHOUT ANY WARRANTY; without even the implied warranty of
|
||
|
* MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the GNU
|
||
|
* Library General Public License for more details.
|
||
|
*
|
||
|
* You should have received a copy of the GNU Library General Public
|
||
|
* License along with this library; if not, write to the
|
||
|
* Free Software Foundation, Inc., 51 Franklin St, Fifth Floor,
|
||
|
* Boston, MA 02110-1301, USA.
|
||
|
*/
|
||
|
#include <avtp.h>
|
||
|
#include <avtp_aaf.h>
|
||
|
#include <avtp_cvf.h>
|
||
|
#include <glib.h>
|
||
|
|
||
|
#include "gstavtpcrfutil.h"
|
||
|
|
||
|
#define AVTP_CVF_H264_HEADER_SIZE (sizeof(struct avtp_stream_pdu) + sizeof(guint32))
|
||
|
|
||
|
gboolean
|
||
|
buffer_size_valid (GstMapInfo * info)
|
||
|
{
|
||
|
struct avtp_stream_pdu *pdu;
|
||
|
guint64 subtype;
|
||
|
guint32 type;
|
||
|
int res;
|
||
|
|
||
|
if (info->size < sizeof (struct avtp_stream_pdu))
|
||
|
return FALSE;
|
||
|
|
||
|
pdu = (struct avtp_stream_pdu *) info->data;
|
||
|
|
||
|
res =
|
||
|
avtp_pdu_get ((struct avtp_common_pdu *) pdu, AVTP_FIELD_SUBTYPE, &type);
|
||
|
g_assert (res == 0);
|
||
|
res = avtp_cvf_pdu_get (pdu, AVTP_CVF_FIELD_FORMAT_SUBTYPE, &subtype);
|
||
|
g_assert (res == 0);
|
||
|
|
||
|
if (type == AVTP_SUBTYPE_CVF && subtype == AVTP_CVF_FORMAT_SUBTYPE_H264
|
||
|
&& info->size < AVTP_CVF_H264_HEADER_SIZE)
|
||
|
return FALSE;
|
||
|
|
||
|
return TRUE;
|
||
|
}
|
||
|
|
||
|
GstClockTime
|
||
|
get_avtp_tstamp (GstAvtpCrfBase * avtpcrfbase, struct avtp_stream_pdu *pdu)
|
||
|
{
|
||
|
guint64 tstamp = GST_CLOCK_TIME_NONE, tstamp_valid;
|
||
|
guint32 type;
|
||
|
int res;
|
||
|
|
||
|
res =
|
||
|
avtp_pdu_get ((struct avtp_common_pdu *) pdu, AVTP_FIELD_SUBTYPE, &type);
|
||
|
g_assert (res == 0);
|
||
|
|
||
|
switch (type) {
|
||
|
case AVTP_SUBTYPE_AAF:
|
||
|
res = avtp_aaf_pdu_get (pdu, AVTP_AAF_FIELD_TV, &tstamp_valid);
|
||
|
g_assert (res == 0);
|
||
|
if (!tstamp_valid)
|
||
|
break;
|
||
|
|
||
|
res = avtp_aaf_pdu_get (pdu, AVTP_AAF_FIELD_TIMESTAMP, &tstamp);
|
||
|
g_assert (res == 0);
|
||
|
break;
|
||
|
case AVTP_SUBTYPE_CVF:
|
||
|
res = avtp_cvf_pdu_get (pdu, AVTP_CVF_FIELD_TV, &tstamp_valid);
|
||
|
g_assert (res == 0);
|
||
|
if (!tstamp_valid)
|
||
|
break;
|
||
|
|
||
|
res = avtp_cvf_pdu_get (pdu, AVTP_CVF_FIELD_TIMESTAMP, &tstamp);
|
||
|
g_assert (res == 0);
|
||
|
break;
|
||
|
default:
|
||
|
GST_INFO_OBJECT (avtpcrfbase, "type 0x%x not supported.\n", type);
|
||
|
break;
|
||
|
}
|
||
|
|
||
|
return (GstClockTime) tstamp;
|
||
|
}
|
||
|
|
||
|
gboolean
|
||
|
h264_tstamp_valid (struct avtp_stream_pdu *pdu)
|
||
|
{
|
||
|
guint64 subtype, h264_time_valid;
|
||
|
guint32 type;
|
||
|
int res;
|
||
|
|
||
|
/*
|
||
|
* Validate H264 timestamp for H264 format. For more details about the
|
||
|
* timestamp look at IEEE 1722-2016 Section 8.5.3.1
|
||
|
*/
|
||
|
res =
|
||
|
avtp_pdu_get ((struct avtp_common_pdu *) pdu, AVTP_FIELD_SUBTYPE, &type);
|
||
|
g_assert (res == 0);
|
||
|
if (type == AVTP_SUBTYPE_CVF) {
|
||
|
res = avtp_cvf_pdu_get (pdu, AVTP_CVF_FIELD_FORMAT_SUBTYPE, &subtype);
|
||
|
g_assert (res == 0);
|
||
|
res = avtp_cvf_pdu_get (pdu, AVTP_CVF_FIELD_H264_PTV, &h264_time_valid);
|
||
|
g_assert (res == 0);
|
||
|
|
||
|
if (subtype == AVTP_CVF_FORMAT_SUBTYPE_H264 && h264_time_valid)
|
||
|
return TRUE;
|
||
|
}
|
||
|
return FALSE;
|
||
|
}
|