Commit eb9789ac authored by Jean-Paul Saman's avatar Jean-Paul Saman

Implement VBI_data_descriptor according to EN 300 468 v1.7.1 section 6.2.46.

parent 0602ad23
......@@ -31,6 +31,7 @@ pkginclude_HEADERS = dvbpsi.h psi.h descriptor.h demux.h \
descriptors/dr_0e.h \
descriptors/dr_0f.h \
descriptors/dr_42.h \
descriptors/dr_45.h \
descriptors/dr_47.h \
descriptors/dr_48.h \
descriptors/dr_4d.h \
......@@ -57,6 +58,7 @@ descriptors_src = descriptors/dr_02.c \
descriptors/dr_0e.c \
descriptors/dr_0f.c \
descriptors/dr_42.c \
descriptors/dr_45.c \
descriptors/dr_47.c \
descriptors/dr_48.c \
descriptors/dr_4d.c \
......@@ -69,7 +71,7 @@ descriptors_src = descriptors/dr_02.c \
tables_src = tables/pat.c tables/pat_private.h \
tables/pmt.c tables/pmt_private.h \
tables/sdt.c tables/sdt_private.h \
tables/eit.c tables/eit_private.h \
tables/cat.c tables/cat_private.h
tables/sdt.c tables/sdt_private.h \
tables/eit.c tables/eit_private.h \
tables/cat.c tables/cat_private.h
/*****************************************************************************
* dr_45.c
* (c)2004-2007 VideoLAN
* $Id$
*
* Authors: Jean-Paul Saman <jpsaman at videolan dot org>
*
* This program is free software; you can redistribute it and/or
* modify it under the terms of the GNU General Public License
* as published by the Free Software Foundation; either version 2
* of the License, or (at your option) any later version.
*
* This program 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 General Public License for more details.
*
* You should have received a copy of the GNU General Public License
* along with this program; if not, write to the Free Software
* Foundation, Inc., 59 Temple Place - Suite 330, Boston, MA 02111-1307, USA.
*
*****************************************************************************/
#include "config.h"
#include <stdio.h>
#include <stdlib.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_45.h"
/*****************************************************************************
* dvbpsi_DecodeVBIDataDr
*****************************************************************************/
dvbpsi_vbi_dr_t * dvbpsi_DecodeVBIDataDr(
dvbpsi_descriptor_t * p_descriptor)
{
int i_services_number, i;
dvbpsi_vbi_dr_t * p_decoded;
/* Check the tag */
if( p_descriptor->i_tag != 0x45 )
{
DVBPSI_ERROR_ARG("dr_45 decoder", "bad tag (0x%x)", p_descriptor->i_tag);
return NULL;
}
/* Don't decode twice */
if(p_descriptor->p_decoded)
return p_descriptor->p_decoded;
/* Decode data and check the length */
if(p_descriptor->i_length < 3)
{
DVBPSI_ERROR_ARG("dr_45 decoder", "bad length (%d)",
p_descriptor->i_length);
return NULL;
}
if(p_descriptor->i_length % 3)
{
DVBPSI_ERROR_ARG("dr_45 decoder", "length not multiple of 3(%d)",
p_descriptor->i_length);
return NULL;
}
i_services_number = p_descriptor->i_length / 3;
/* Allocate memory */
p_decoded =
(dvbpsi_vbi_dr_t*)malloc(sizeof(dvbpsi_vbi_dr_t));
if(!p_decoded)
{
DVBPSI_ERROR("dr_45 decoder", "out of memory");
return NULL;
}
p_decoded->i_services_number = i_services_number;
for(i=0; i < i_services_number; i++)
{
int n, i_lines = 0, i_data_service_id;
i_data_service_id = ((uint8_t)(p_descriptor->p_data[3 * i + 2 + i_lines]));
p_decoded->p_services[i].i_data_service_id = i_data_service_id;
i_lines = ((uint8_t)(p_descriptor->p_data[3 * i + 3]));
p_decoded->p_services[i].i_lines = i_lines;
for(n=0; n < i_lines; n++ )
{
if( (i_data_service_id >= 0x01) && (i_data_service_id <= 0x07) )
{
p_decoded->p_services[i].p_lines[n].i_parity =
((uint8_t)(p_descriptor->p_data[3 * i + 3 + n])&0x20);
p_decoded->p_services[i].p_lines[n].i_line_offset =
((uint8_t)(p_descriptor->p_data[3 * i + 3 + n])&0x1f);
}
}
}
p_descriptor->p_decoded = (void*)p_decoded;
return p_decoded;
}
/*****************************************************************************
* dvbpsi_GenVBIDataDr
*****************************************************************************/
dvbpsi_descriptor_t * dvbpsi_GenVBIDataDr(
dvbpsi_vbi_dr_t * p_decoded,
int b_duplicate)
{
int i;
/* Create the descriptor */
dvbpsi_descriptor_t * p_descriptor =
dvbpsi_NewDescriptor(0x45, p_decoded->i_services_number * 5 , NULL);
if(p_descriptor)
{
/* Encode data */
for (i=0; i < p_decoded->i_services_number; i++ )
{
int n;
p_descriptor->p_data[5 * i + 3] =
( (uint8_t) p_decoded->p_services[i].i_data_service_id );
p_descriptor->p_data[5 * i + 4] = p_decoded->p_services[i].i_lines;
for (n=0; n < p_decoded->p_services[i].i_lines; n++ )
{
if( (p_decoded->p_services[i].i_data_service_id >= 0x01) &&
(p_decoded->p_services[i].i_data_service_id <= 0x07) )
{
p_descriptor->p_data[5 * i + 4 + n] = (uint8_t)
( ((uint8_t) p_decoded->p_services[i].p_lines[n].i_parity)&0x20) |
( ((uint8_t) p_decoded->p_services[i].p_lines[n].i_line_offset)&0x1f);
}
else p_descriptor->p_data[5 * i + 3 + n] = 0xFF; /* Stuffing byte */
}
}
if(b_duplicate)
{
/* Duplicate decoded data */
dvbpsi_vbi_dr_t * p_dup_decoded =
(dvbpsi_vbi_dr_t*)malloc(sizeof(dvbpsi_vbi_dr_t));
if(p_dup_decoded)
memcpy(p_dup_decoded, p_decoded, sizeof(dvbpsi_vbi_dr_t));
p_descriptor->p_decoded = (void*)p_dup_decoded;
}
}
return p_descriptor;
}
/*****************************************************************************
* dr_45.h
* (c)2004-2007 VideoLAN
* $Id$
*
* Authors: Jean-Paul Saman <jpsaman at videolan dot org>
*
* This program is free software; you can redistribute it and/or
* modify it under the terms of the GNU General Public License
* as published by the Free Software Foundation; either version 2
* of the License, or (at your option) any later version.
*
* This program 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 General Public License for more details.
*
* You should have received a copy of the GNU General Public License
* along with this program; if not, write to the Free Software
* Foundation, Inc., 59 Temple Place - Suite 330, Boston, MA 02111-1307, USA.
*
*****************************************************************************/
/*!
* \file <dr_45.h>
* \author Jean-Paul Saman <jpsaman at videolan dot org>
* \brief VBI data descriptor parsing.
*
* DVB VBI data descriptor parsing, according to ETSI EN 300 468
* version 1.7.1 section 6.2.46
*
* NOTE: this descriptor is known by tag value 0x45
*/
#ifndef _DVBPSI_DR_45_H_
#define _DVBPSI_DR_45_H_
#ifdef __cplusplus
extern "C" {
#endif
/*****************************************************************************
* dvbpsi_vbidata_line_t
*****************************************************************************/
/*!
* \struct dvbpsi_vbidata_line_t
* \brief one VBI Data line structure.
*
* This structure is used since vbidata_t structure will contain several
* of these structures
*/
/*!
* \typedef struct dvbpsi_vbidata_line_s dvbpsi_vbidata_line_t
* \brief dvbpsi_vbidata_line_t type definition.
*/
typedef struct dvbpsi_vbidata_line_s
{
uint8_t i_parity; /* 1 bits */
uint8_t i_line_offset; /* 5 bits */
} dvbpsi_vbidata_line_t;
/*****************************************************************************
* dvbpsi_vbidata_t
*****************************************************************************/
/*!
* \struct dvbpsi_vbidata_t
* \brief one VBI data structure.
*
* This structure is used since vbi_descriptor will contain several
* of these structures
*/
/*!
* \typedef struct dvbpsi_vbidata_s dvbpsi_vbidata_t
* \brief dvbpsi_vbidata_t type definition.
*/
typedef struct dvbpsi_vbidata_s
{
uint8_t i_data_service_id; /* 8 bits */
uint8_t i_lines;
dvbpsi_vbidata_line_t p_lines[255];
} dvbpsi_vbidata_t;
/*****************************************************************************
* dvbpsi_vbi_dr_t
*****************************************************************************/
/*!
* \struct dvbpsi_vbi_dr_s
* \brief "teletext" descriptor structure.
*
* This structure is used to store a decoded "VBI data"
* descriptor. (ETSI EN 300 468 version 1.7.1 section 6.2.46).
*/
/*!
* \typedef struct dvbpsi_vbi_dr_s dvbpsi_vbi_dr_t
* \brief dvbpsi_vbi_dr_t type definition.
*/
typedef struct dvbpsi_vbi_dr_s
{
uint8_t i_services_number;
dvbpsi_vbidata_t p_services[85];
} dvbpsi_vbi_dr_t;
/*****************************************************************************
* dvbpsi_DecodeVBIDataDr
*****************************************************************************/
/*!
* \fn dvbpsi_vbi_dr_t * dvbpsi_DecodeVBIDataDr(
dvbpsi_descriptor_t * p_descriptor)
* \brief "VBI data" descriptor decoder.
* \param p_descriptor pointer to the descriptor structure
* \return a pointer to a new "VBI data" descriptor structure
* which contains the decoded data.
*/
dvbpsi_vbi_dr_t* dvbpsi_DecodeVBIDataDr(
dvbpsi_descriptor_t * p_descriptor);
/*****************************************************************************
* dvbpsi_GenVBIDataDr
*****************************************************************************/
/*!
* \fn dvbpsi_descriptor_t * dvbpsi_GenVBIDataDr(
dvbpsi_vbi_dr_t * p_decoded, int b_duplicate)
* \brief "VBI data" descriptor generator.
* \param p_decoded pointer to a decoded "VBI data" descriptor
* structure
* \param b_duplicate if non zero 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_GenVBIDataDr(
dvbpsi_vbi_dr_t * p_decoded,
int b_duplicate);
#ifdef __cplusplus
};
#endif
#else
#error "Multiple inclusions of dr_45.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