dr_48.c   dr_48.c 
/************************************************************************** *** /************************************************************************** ***
* dr_48.c * dr_48.c
* Copyright (C) 2001-2010 VideoLAN * Copyright (C) 2001-2011 VideoLAN
* $Id$ * $Id$
* *
* Authors: Arnaud de Bossoreille de Ribou <bozo@via.ecp.fr> * Authors: Arnaud de Bossoreille de Ribou <bozo@via.ecp.fr>
* Johan Bilien <jobi@via.ecp.fr> * Johan Bilien <jobi@via.ecp.fr>
* *
* This library is free software; you can redistribute it and/or * This library is free software; you can redistribute it and/or
* modify it under the terms of the GNU Lesser General Public * modify it under the terms of the GNU Lesser General Public
* License as published by the Free Software Foundation; either * License as published by the Free Software Foundation; either
* version 2.1 of the License, or (at your option) any later version. * version 2.1 of the License, or (at your option) any later version.
* *
skipping to change at line 29 skipping to change at line 29
* You should have received a copy of the GNU Lesser General Public * You should have received a copy of the GNU Lesser General Public
* License along with this library; if not, write to the Free Software * License along with this library; if not, write to the Free Software
* Foundation, Inc., 51 Franklin Street, Fifth Floor, Boston, MA 02110-130 1 USA * Foundation, Inc., 51 Franklin Street, Fifth Floor, Boston, MA 02110-130 1 USA
* *
************************************************************************** ***/ ************************************************************************** ***/
#include "config.h" #include "config.h"
#include <stdio.h> #include <stdio.h>
#include <stdlib.h> #include <stdlib.h>
#include <stdbool.h>
#include <string.h> #include <string.h>
#if defined(HAVE_INTTYPES_H) #if defined(HAVE_INTTYPES_H)
#include <inttypes.h> #include <inttypes.h>
#elif defined(HAVE_STDINT_H) #elif defined(HAVE_STDINT_H)
#include <stdint.h> #include <stdint.h>
#endif #endif
#include "../dvbpsi.h" #include "../dvbpsi.h"
#include "../dvbpsi_private.h" #include "../dvbpsi_private.h"
#include "../descriptor.h" #include "../descriptor.h"
#include "dr_48.h" #include "dr_48.h"
/************************************************************************** *** /************************************************************************** ***
* dvbpsi_DecodeServiceDr * dvbpsi_DecodeServiceDr
************************************************************************** ***/ ************************************************************************** ***/
dvbpsi_service_dr_t * dvbpsi_DecodeServiceDr( dvbpsi_service_dr_t * dvbpsi_DecodeServiceDr(
dvbpsi_descriptor_t * p_descriptor) dvbpsi_descriptor_t * p_descriptor)
{ {
dvbpsi_service_dr_t * p_decoded; /* Check the tag */
if (!dvbpsi_CanDecodeAsDescriptor(p_descriptor, 0x48))
return NULL;
/* Don't decode twice */
if (dvbpsi_IsDescriptorDecoded(p_descriptor))
return p_descriptor->p_decoded;
if (p_descriptor->i_length < 3)
return NULL;
/* Allocate memory */
dvbpsi_service_dr_t * p_decoded;
p_decoded = (dvbpsi_service_dr_t*)malloc(sizeof(dvbpsi_service_dr_t));
if (!p_decoded)
return NULL;
p_descriptor->p_decoded = (void*)p_decoded;
p_decoded->i_service_type = p_descriptor->p_data[0];
p_decoded->i_service_provider_name_length = p_descriptor->p_data[1];
p_decoded->i_service_name_length = 0;
p_decoded->i_service_provider_name[0] = 0;
p_decoded->i_service_name[0] = 0;
if (p_decoded->i_service_provider_name_length + 2 > p_descriptor->i_len
gth)
return p_decoded;
if (p_decoded->i_service_provider_name_length)
memcpy(p_decoded->i_service_provider_name,
p_descriptor->p_data + 2,
p_decoded->i_service_provider_name_length);
if (p_decoded->i_service_provider_name_length + 3 > p_descriptor->i_len
gth)
return p_decoded;
p_decoded->i_service_name_length =
p_descriptor->p_data[2+p_decoded->i_service_provider_name_lengt
h];
if (p_decoded->i_service_provider_name_length + 3 +
p_decoded->i_service_name_length > p_descriptor->i_length)
return p_decoded;
if (p_decoded->i_service_name_length)
memcpy(p_decoded->i_service_name,
p_descriptor->p_data + 3 + p_decoded->i_service_provider_nam
e_length,
p_decoded->i_service_name_length);
/* Check the tag */ return p_decoded;
if(p_descriptor->i_tag != 0x48)
{
DVBPSI_ERROR_ARG("dr_48 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;
/* Allocate memory */
p_decoded =
(dvbpsi_service_dr_t*)malloc(sizeof(dvbpsi_service_dr_t));
if(!p_decoded)
{
DVBPSI_ERROR("dr_48 decoder", "out of memory");
return NULL;
}
/* Decode data and check the length */
if(p_descriptor->i_length < 3)
{
DVBPSI_ERROR_ARG("dr_07 decoder", "bad length (%d)",
p_descriptor->i_length);
free(p_decoded);
return NULL;
}
p_descriptor->p_decoded = (void*)p_decoded;
p_decoded->i_service_type = p_descriptor->p_data[0];
p_decoded->i_service_provider_name_length = p_descriptor->p_data[1];
p_decoded->i_service_name_length = 0;
p_decoded->i_service_provider_name[0] = 0;
p_decoded->i_service_name[0] = 0;
if(p_decoded->i_service_provider_name_length + 2 > p_descriptor->i_length
)
return p_decoded;
if(p_decoded->i_service_provider_name_length)
memcpy(p_decoded->i_service_provider_name,
p_descriptor->p_data + 2,
p_decoded->i_service_provider_name_length);
if(p_decoded->i_service_provider_name_length + 3 > p_descriptor->i_length
)
return p_decoded;
p_decoded->i_service_name_length =
p_descriptor->p_data[2+p_decoded->i_service_provider_name_length];
if(p_decoded->i_service_provider_name_length + 3 +
p_decoded->i_service_name_length > p_descriptor->i_length)
return p_decoded;
if(p_decoded->i_service_name_length)
memcpy(p_decoded->i_service_name,
p_descriptor->p_data + 3 + p_decoded->i_service_provider_name_le
ngth,
p_decoded->i_service_name_length);
return p_decoded;
} }
/************************************************************************** *** /************************************************************************** ***
* dvbpsi_GenServiceDr * dvbpsi_GenServiceDr
************************************************************************** ***/ ************************************************************************** ***/
dvbpsi_descriptor_t * dvbpsi_GenServiceDr( dvbpsi_descriptor_t * dvbpsi_GenServiceDr(dvbpsi_service_dr_t * p_decoded,
dvbpsi_service_dr_t * p_decoded, bool b_duplicate)
int b_duplicate)
{ {
/* Create the descriptor */ /* Create the descriptor */
dvbpsi_descriptor_t * p_descriptor = dvbpsi_descriptor_t * p_descriptor =
dvbpsi_NewDescriptor(0x48, 3 + p_decoded->i_service_name_length + dvbpsi_NewDescriptor(0x48, 3 + p_decoded->i_service_name_length
p_decoded->i_service_provider_name_length , NULL); +
p_decoded->i_service_provider_name_length
, NULL);
if (!p_descriptor)
return NULL;
if(p_descriptor)
{
/* Encode data */ /* Encode data */
p_descriptor->p_data[0] = p_decoded->i_service_type; p_descriptor->p_data[0] = p_decoded->i_service_type;
p_descriptor->p_data[1] = p_decoded->i_service_provider_name_length; p_descriptor->p_data[1] = p_decoded->i_service_provider_name_length;
if(p_decoded->i_service_provider_name_length) if (p_decoded->i_service_provider_name_length)
memcpy(p_descriptor->p_data + 2, memcpy(p_descriptor->p_data + 2,
p_decoded->i_service_provider_name, p_decoded->i_service_provider_name,
p_decoded->i_service_provider_name_length); p_decoded->i_service_provider_name_length);
p_descriptor->p_data[2+p_decoded->i_service_provider_name_length] = p_descriptor->p_data[2+p_decoded->i_service_provider_name_length] =
p_decoded->i_service_name_length; p_decoded->i_service_name_length;
if(p_decoded->i_service_name_length) if (p_decoded->i_service_name_length)
memcpy(p_descriptor->p_data + 3 + p_decoded->i_service_provider_name_ memcpy(p_descriptor->p_data + 3 + p_decoded->i_service_provider_nam
length, e_length,
p_decoded->i_service_name, p_decoded->i_service_name,
p_decoded->i_service_name_length); p_decoded->i_service_name_length);
if(b_duplicate) if (b_duplicate)
{ {
/* Duplicate decoded data */ /* Duplicate decoded data */
dvbpsi_service_dr_t * p_dup_decoded = p_descriptor->p_decoded =
(dvbpsi_service_dr_t*)malloc(sizeof(dvbpsi_service_dr_t)); dvbpsi_DuplicateDecodedDescriptor(p_decoded,
if(p_dup_decoded) sizeof(dvbpsi_service_dr_
memcpy(p_dup_decoded, p_decoded, sizeof(dvbpsi_service_dr_t)); t));
p_descriptor->p_decoded = (void*)p_dup_decoded;
} }
}
return p_descriptor; return p_descriptor;
} }
 End of changes. 13 change blocks. 
96 lines changed or deleted 81 lines changed or added

This html diff was produced by rfcdiff 1.41. The latest version is available from http://tools.ietf.org/tools/rfcdiff/