dr_4d.c   dr_4d.c 
/************************************************************************** *** /************************************************************************** ***
* dr_4d.c * dr_4d.c
* Copyright (C) 2005-2010 VideoLAN * Copyright (C) 2005-2011 VideoLAN
* $Id: dr_4d.c,v 1.7 2003/07/25 20:20:40 fenrir Exp $ * $Id: dr_4d.c,v 1.7 2003/07/25 20:20:40 fenrir Exp $
* *
* Authors: Laurent Aimar <fenrir@via.ecp.fr> * Authors: Laurent Aimar <fenrir@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.
* *
* This library is distributed in the hope that it will be useful, * This library is distributed in the hope that it will be useful,
skipping to change at line 28 skipping to change at line 28
* 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"
skipping to change at line 52 skipping to change at line 53
/************************************************************************** *** /************************************************************************** ***
* dvbpsi_DecodeShortEventDr * dvbpsi_DecodeShortEventDr
************************************************************************** ***/ ************************************************************************** ***/
dvbpsi_short_event_dr_t * dvbpsi_DecodeShortEventDr(dvbpsi_descriptor_t * p _descriptor) dvbpsi_short_event_dr_t * dvbpsi_DecodeShortEventDr(dvbpsi_descriptor_t * p _descriptor)
{ {
dvbpsi_short_event_dr_t * p_decoded; dvbpsi_short_event_dr_t * p_decoded;
int i_len1; int i_len1;
int i_len2; int i_len2;
/* Check the tag */ /* Check the tag */
if(p_descriptor->i_tag != 0x4d || if (!dvbpsi_CanDecodeAsDescriptor(p_descriptor, 0x4d) ||
p_descriptor->i_length < 5 ) p_descriptor->i_length < 5 )
{
DVBPSI_ERROR_ARG("dr_4d decoder", "bad tag or corrupted(0x%x)", p_descr
iptor->i_tag);
return NULL; return NULL;
}
/* Don't decode twice */
if (dvbpsi_IsDescriptorDecoded(p_descriptor))
return p_descriptor->p_decoded;
/* Check length */ /* Check length */
i_len1 = p_descriptor->p_data[3]; i_len1 = p_descriptor->p_data[3];
i_len2 = p_descriptor->p_data[4+i_len1]; i_len2 = p_descriptor->p_data[4+i_len1];
if( p_descriptor->i_length < 5 + i_len1 + i_len2 )
{ if (p_descriptor->i_length < 5 + i_len1 + i_len2)
DVBPSI_ERROR_ARG("dr_4d decoder", "invalid length/content (tag=0x%x)",
p_descriptor->i_tag );
return NULL; return NULL;
}
/* Don't decode twice */ /* Don't decode twice */
if(p_descriptor->p_decoded) if (p_descriptor->p_decoded)
return p_descriptor->p_decoded; return p_descriptor->p_decoded;
/* Allocate memory */ /* Allocate memory */
p_decoded = malloc(sizeof(dvbpsi_short_event_dr_t)); p_decoded = malloc(sizeof(dvbpsi_short_event_dr_t));
if(!p_decoded) if (!p_decoded)
{ return NULL;
DVBPSI_ERROR("dr_4d decoder", "out of memory");
return NULL;
}
/* Decode data and check the length */ /* Decode data and check the length */
memcpy( p_decoded->i_iso_639_code, &p_descriptor->p_data[0], 3 ); memcpy( p_decoded->i_iso_639_code, &p_descriptor->p_data[0], 3 );
p_decoded->i_event_name_length = i_len1; p_decoded->i_event_name_length = i_len1;
if( i_len1 > 0 ) if (i_len1 > 0)
memcpy( p_decoded->i_event_name, &p_descriptor->p_data[3+1], i_len1 ) ; memcpy( p_decoded->i_event_name, &p_descriptor->p_data[3+1], i_len1 ) ;
p_decoded->i_text_length = i_len2; p_decoded->i_text_length = i_len2;
if( i_len2 > 0 ) if (i_len2 > 0)
memcpy( p_decoded->i_text, &p_descriptor->p_data[4+i_len1+1], i_len2 ); memcpy( p_decoded->i_text, &p_descriptor->p_data[4+i_len1+1], i_len2 );
p_descriptor->p_decoded = (void*)p_decoded; p_descriptor->p_decoded = (void*)p_decoded;
return p_decoded; return p_decoded;
} }
/************************************************************************** *** /************************************************************************** ***
* dvbpsi_GenShortEventDr * dvbpsi_GenShortEventDr
************************************************************************** ***/ ************************************************************************** ***/
dvbpsi_descriptor_t * dvbpsi_GenShortEventDr(dvbpsi_short_event_dr_t * p_de coded, dvbpsi_descriptor_t * dvbpsi_GenShortEventDr(dvbpsi_short_event_dr_t * p_de coded,
int b_duplicate) bool b_duplicate)
{ {
int i_len1 = p_decoded->i_event_name_length; int i_len1 = p_decoded->i_event_name_length;
int i_len2 = p_decoded->i_text_length; int i_len2 = p_decoded->i_text_length;
/* Create the descriptor */
dvbpsi_descriptor_t * p_descriptor = dvbpsi_NewDescriptor(0x4d, 5 + i_l
en1 + i_len2, NULL );
/* Create the descriptor */ if (!p_descriptor)
dvbpsi_descriptor_t * p_descriptor = return NULL;
dvbpsi_NewDescriptor(0x4d, 5 + i_len1 + i_len2, NULL );
if(p_descriptor)
{
/* Encode data */ /* Encode data */
memcpy( &p_descriptor->p_data[0], p_decoded->i_iso_639_code, 3 ); memcpy( &p_descriptor->p_data[0], p_decoded->i_iso_639_code, 3 );
p_descriptor->p_data[3] = i_len1; p_descriptor->p_data[3] = i_len1;
if( i_len1 ) if (i_len1)
memcpy( &p_descriptor->p_data[4], p_decoded->i_event_name, i_len1 ) ; memcpy( &p_descriptor->p_data[4], p_decoded->i_event_name, i_len1 ) ;
p_descriptor->p_data[3+i_len1] = i_len2; p_descriptor->p_data[3+1+i_len1] = i_len2;
if( i_len2 ) if (i_len2)
memcpy( &p_descriptor->p_data[3+i_len1+1], p_decoded->i_text, i_len memcpy( &p_descriptor->p_data[3+1+i_len1+1], p_decoded->i_text, i_l
2 ); en2 );
if(b_duplicate) if (b_duplicate)
{ {
/* Duplicate decoded data */ /* Duplicate decoded data */
dvbpsi_short_event_dr_t * p_dup_decoded = p_descriptor->p_decoded =
(dvbpsi_short_event_dr_t*)malloc(sizeof(dvbpsi_short_event_ dvbpsi_DuplicateDecodedDescriptor(p_decoded,
dr_t)); sizeof(dvbpsi_short_event
if(p_dup_decoded) _dr_t));
memcpy(p_dup_decoded, p_decoded, sizeof(dvbpsi_short_event_dr_t));
p_descriptor->p_decoded = (void*)p_dup_decoded;
} }
}
return p_descriptor; return p_descriptor;
} }
 End of changes. 20 change blocks. 
44 lines changed or deleted 37 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/