Commit 173c3586 authored by Jean-Paul Saman's avatar Jean-Paul Saman

Add 0x53 descriptor (CA system id)

parent 13e9ce37
......@@ -52,6 +52,7 @@ pkginclude_HEADERS = dvbpsi.h psi.h descriptor.h demux.h \
descriptors/dr_4f.h \
descriptors/dr_50.h \
descriptors/dr_52.h \
descriptors/dr_53.h \
descriptors/dr_54.h \
descriptors/dr_55.h \
descriptors/dr_56.h \
......@@ -100,6 +101,7 @@ descriptors_src = descriptors/dr_02.c \
descriptors/dr_4f.c \
descriptors/dr_50.c \
descriptors/dr_52.c \
descriptors/dr_53.c \
descriptors/dr_54.c \
descriptors/dr_55.c \
descriptors/dr_56.c \
......
......@@ -64,6 +64,7 @@
#include "dr_4f.h"
#include "dr_50.h"
#include "dr_52.h"
#include "dr_53.h"
#include "dr_54.h"
#include "dr_55.h"
#include "dr_56.h"
......@@ -73,9 +74,9 @@
#include "dr_62.h"
#include "dr_66.h"
#include "dr_69.h"
#include "dr_7c.h"
#include "dr_73.h"
#include "dr_76.h"
#include "dr_7c.h"
#include "dr_83.h"
#include "dr_8a.h"
......
/*****************************************************************************
* dr_53.c
* Copyright (C) 2013, M2X BV
*
* Authors: Jean-Paul Saman <jpsaman@videolan.org>
*
* This library is free software; you can redistribute it and/or
* modify it under the terms of the GNU Lesser General Public
* License as published by the Free Software Foundation; either
* version 2.1 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
* Lesser General Public License for more details.
*
* You should have received a copy of the GNU Lesser General Public
* License along with this library; if not, write to the Free Software
* Foundation, Inc., 51 Franklin Street, Fifth Floor, Boston, MA 02110-1301 USA
*
*****************************************************************************/
#include "config.h"
#include <stdio.h>
#include <stdlib.h>
#include <stdbool.h>
#include <string.h>
#if defined(HAVE_INTTYPES_H)
#include <inttypes.h>
#elif defined(HAVE_STDINT_H)
#include <stdint.h>
#endif
#include "../dvbpsi.h"
#include "../dvbpsi_private.h"
#include "../descriptor.h"
#include "dr_53.h"
/*****************************************************************************
* dvbpsi_DecodeCAIdentifierDr
*****************************************************************************/
dvbpsi_ca_identifier_dr_t * dvbpsi_DecodeCAIdentifierDr(dvbpsi_descriptor_t *p_descriptor)
{
dvbpsi_ca_identifier_dr_t * p_decoded;
/* Check the tag */
if (!dvbpsi_CanDecodeAsDescriptor(p_descriptor, 0x53))
return NULL;
/* Don't decode twice */
if (dvbpsi_IsDescriptorDecoded(p_descriptor))
return p_descriptor->p_decoded;
if (p_descriptor->i_length < 1)
return NULL;
/* Allocate memory */
p_decoded = (dvbpsi_ca_identifier_dr_t*)calloc(1, sizeof(dvbpsi_ca_identifier_dr_t));
if (!p_decoded)
return NULL;
int i_number = p_descriptor->i_length / 2;
if (i_number > DVBPSI_CA_SYSTEM_ID_DR_MAX)
i_number = DVBPSI_CA_SYSTEM_ID_DR_MAX;
p_decoded->i_number = i_number;
for (int i = 0; i < i_number; i++)
{
/* TODO: decode CA system identifier values */
p_decoded->p_system[i].i_ca_system_id = p_descriptor->p_data[2 * i];
}
p_descriptor->p_decoded = (void*)p_decoded;
return p_decoded;
}
/*****************************************************************************
* dvbpsi_GenCAIdentifierDr
*****************************************************************************/
dvbpsi_descriptor_t * dvbpsi_GenCAIdentifierDr(dvbpsi_ca_identifier_dr_t *p_decoded,
bool b_duplicate)
{
if (p_decoded->i_number > DVBPSI_CA_SYSTEM_ID_DR_MAX)
p_decoded->i_number = DVBPSI_CA_SYSTEM_ID_DR_MAX;
/* Create the descriptor */
dvbpsi_descriptor_t * p_descriptor = dvbpsi_NewDescriptor(0x53, p_decoded->i_number * 2, NULL);
if (!p_descriptor)
return NULL;
/* Encode data */
for (int i = 0; i < p_decoded->i_number; i++ )
{
p_descriptor->p_data[2 * i] = p_decoded->p_system[i].i_ca_system_id >> 8;
p_descriptor->p_data[2 * i + 1] = p_decoded->p_system[i].i_ca_system_id;
}
if (b_duplicate)
{
/* Duplicate decoded data */
p_descriptor->p_decoded =
dvbpsi_DuplicateDecodedDescriptor(p_decoded,
sizeof(dvbpsi_ca_identifier_dr_t));
}
return p_descriptor;
}
/*****************************************************************************
* dr_53.h
* Copyright (C) 2013, M2X BV
*
* Authors: Jean-Paul Saman <jpsaman@videolan.org>
*
* This library is free software; you can redistribute it and/or
* modify it under the terms of the GNU Lesser General Public
* License as published by the Free Software Foundation; either
* version 2.1 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
* Lesser General Public License for more details.
*
* You should have received a copy of the GNU Lesser General Public
* License along with this library; if not, write to the Free Software
* Foundation, Inc., 51 Franklin Street, Fifth Floor, Boston, MA 02110-1301 USA
*
*****************************************************************************/
/*!
* \file <dr_53.h>
* \author Jean-Paul Saman <jpsaman@videolan.org>
* \brief Application interface for the DVB "CA identifier"
* descriptor decoder and generator.
*
* Application interface for the DVB "CA identifier" descriptor
* decoder and generator. This descriptor's definition can be found in
* ETSI EN 300 468 section 6.2.5.
*/
#ifndef _DVBPSI_DR_53_H_
#define _DVBPSI_DR_53_H_
#ifdef __cplusplus
extern "C" {
#endif
/*****************************************************************************
* dvbpsi_ca_system_s
*****************************************************************************/
/*!
* \struct dvbpsi_ca_system_s
* \brief CA system identifier structure
*
* This structure is used to identify the individual CA system types.
*/
/*!
* \typedef struct dvbpsi_ca_system_s dvbpsi_ca_system_t
* \brief dvbpsi_ca_system_t type definition. The CA system identifier
* field is allocated using values found in ETSI TS 101 162.
*/
typedef struct dvbpsi_ca_system_s
{
uint16_t i_ca_system_id; /*!< CA system identifier */
} dvbpsi_ca_system_t;
/*!
* \def DVBPSI_CA_SYSTEM_ID_DR_MAX
* \brief Maximum number of dvbpsi_ca_system_t entries present in @see dvbpsi_ca_identifier_dr_t
*/
#define DVBPSI_CA_SYSTEM_ID_DR_MAX 127
/*****************************************************************************
* dvbpsi_ca_identifier_dr_s
*****************************************************************************/
/*!
* \struct dvbpsi_ca_identifier_dr_s
* \brief "CA identifier" descriptor structure.
*
* This structure is used to store a decoded "CA identifier"
* descriptor. (ETSI EN 300 468 section 6.2.5).
*/
/*!
* \typedef struct dvbpsi_ca_identifier_dr_s dvbpsi_ca_identifier_dr_t
* \brief dvbpsi_ca_identifier_dr_t type definition.
*/
typedef struct dvbpsi_ca_identifier_dr_s
{
uint8_t i_number; /*!< number of CA system identifiers */
dvbpsi_ca_system_t p_system[DVBPSI_CA_SYSTEM_ID_DR_MAX]; /*!< CA system identifiers */
} dvbpsi_ca_identifier_dr_t;
/*****************************************************************************
* dvbpsi_DecodeCAIdentifierDr
*****************************************************************************/
/*!
* \fn dvbpsi_da_identifier_dr_t * dvbpsi_DecodeCAIdentifierDr(
dvbpsi_descriptor_t *p_descriptor)
* \brief "DA identifier" descriptor decoder.
* \param p_descriptor pointer to the descriptor structure
* \return a pointer to a new "CA identifier" descriptor structure
* which contains the decoded data.
*/
dvbpsi_ca_identifier_dr_t* dvbpsi_DecodeCAIdentifierDr(dvbpsi_descriptor_t *p_descriptor);
/*****************************************************************************
* dvbpsi_GenStreamIdentifierDr
*****************************************************************************/
/*!
* \fn dvbpsi_descriptor_t *dvbpsi_GenCAIdentifierDr(
dvbpsi_ca_identifier_dr_t *p_decoded, bool b_duplicate)
* \brief "CA identifier" descriptor generator.
* \param p_decoded pointer to a decoded "CA identifier" descriptor
* structure
* \param b_duplicate if true then duplicate the p_decoded structure into
* the descriptor
* \return a pointer to a new descriptor structure which contains encoded data.
*/
dvbpsi_descriptor_t *dvbpsi_GenCAIdentifierDr(dvbpsi_ca_identifier_dr_t *p_decoded,
bool b_duplicate);
#ifdef __cplusplus
};
#endif
#else
#error "Multiple inclusions of dr_53.h"
#endif
Markdown is supported
0%
or
You are about to add 0 people to the discussion. Proceed with caution.
Finish editing this message first!
Please register or to comment