dr_55.c   dr_55.c 
/************************************************************************** *** /************************************************************************** ***
* dr_55.c * dr_55.c
* Copyright (C) 2004-2010 VideoLAN * Copyright (C) 2004-2011 VideoLAN
* $Id: dr_55.c 89 2004-06-28 19:17:23Z gbazin $ * $Id: dr_55.c 89 2004-06-28 19:17:23Z gbazin $
* *
* Authors: Christophe Massiot <massiot@via.ecp.fr> * Authors: Christophe Massiot <massiot@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"
#include "../descriptor.h" #include "../descriptor.h"
#include "dr_55.h" #include "dr_55.h"
/************************************************************************** *** /************************************************************************** ***
* dvbpsi_DecodeParentalRatingDr * dvbpsi_DecodeParentalRatingDr
************************************************************************** ***/ ************************************************************************** ***/
dvbpsi_parental_rating_dr_t * dvbpsi_DecodeParentalRatingDr( dvbpsi_parental_rating_dr_t * dvbpsi_DecodeParentalRatingDr(
dvbpsi_descriptor_t * p_descriptor) dvbpsi_descriptor_t * p_descriptor)
{ {
int i_ratings_number, i; /* Check the tag */
dvbpsi_parental_rating_dr_t * p_decoded; if (!dvbpsi_CanDecodeAsDescriptor(p_descriptor, 0x55))
return NULL;
/* Don't decode twice */
if (dvbpsi_IsDescriptorDecoded(p_descriptor))
return p_descriptor->p_decoded;
/* Decode data and check the length */
if(p_descriptor->i_length % 4)
return NULL;
/* Allocate memory */
dvbpsi_parental_rating_dr_t * p_decoded;
p_decoded = (dvbpsi_parental_rating_dr_t*)malloc(sizeof(dvbpsi_parental
_rating_dr_t));
if (!p_decoded)
return NULL;
/* Check the tag */ int i_ratings_number = p_descriptor->i_length / 4;
if(p_descriptor->i_tag != 0x55) p_decoded->i_ratings_number = i_ratings_number;
{
DVBPSI_ERROR_ARG("dr_55 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_parental_rating_dr_t*)malloc(sizeof(dvbpsi_parental_rating_
dr_t));
if(!p_decoded)
{
DVBPSI_ERROR("dr_55 decoder", "out of memory");
return NULL;
}
/* Decode data and check the length */
if(p_descriptor->i_length % 4)
{
DVBPSI_ERROR_ARG("dr_55 decoder", "length not multiple of 4 (%d)",
p_descriptor->i_length);
free(p_decoded);
return NULL;
}
i_ratings_number = p_descriptor->i_length / 4;
p_decoded->i_ratings_number = i_ratings_number;
for (i=0; i < i_ratings_number; i++)
{
p_decoded->p_parental_rating[i].i_country_code =
((uint32_t)p_descriptor->p_data[4 * i] << 16)
| ((uint32_t)p_descriptor->p_data[4 * i + 1] << 8)
| p_descriptor->p_data[4 * i + 2];
p_decoded->p_parental_rating[i].i_rating = p_descriptor->p_data[4 * i + for (int i = 0; i < i_ratings_number; i++)
3]; {
} p_decoded->p_parental_rating[i].i_country_code =
((uint32_t)p_descriptor->p_data[4 * i] << 16)
| ((uint32_t)p_descriptor->p_data[4 * i + 1] << 8)
| p_descriptor->p_data[4 * i + 2];
p_decoded->p_parental_rating[i].i_rating = p_descriptor->p_data[4 *
i + 3];
}
p_descriptor->p_decoded = (void*)p_decoded; p_descriptor->p_decoded = (void*)p_decoded;
return p_decoded; return p_decoded;
} }
/************************************************************************** *** /************************************************************************** ***
* dvbpsi_GenParentalRatingDr * dvbpsi_GenParentalRatingDr
************************************************************************** ***/ ************************************************************************** ***/
dvbpsi_descriptor_t * dvbpsi_GenParentalRatingDr( dvbpsi_descriptor_t * dvbpsi_GenParentalRatingDr(
dvbpsi_parental_rating_dr_t * p_dec oded, dvbpsi_parental_rating_dr_t * p_dec oded,
int b_duplicate) bool b_duplicate)
{ {
int i; /* Create the descriptor */
dvbpsi_descriptor_t * p_descriptor =
dvbpsi_NewDescriptor(0x55, p_decoded->i_ratings_number * 4 , NU
LL);
/* Create the descriptor */ if (!p_descriptor)
dvbpsi_descriptor_t * p_descriptor = return NULL;
dvbpsi_NewDescriptor(0x55, p_decoded->i_ratings_number * 4 , NULL);
if(p_descriptor)
{
/* Encode data */ /* Encode data */
for (i=0; i < p_decoded->i_ratings_number; i++ ) for (int i = 0; i < p_decoded->i_ratings_number; i++ )
{ {
p_descriptor->p_data[8 * i] = p_descriptor->p_data[8 * i] =
p_decoded->p_parental_rating[i].i_country_code >> 16; p_decoded->p_parental_rating[i].i_country_code >> 16;
p_descriptor->p_data[8 * i + 1] = p_descriptor->p_data[8 * i + 1] =
(p_decoded->p_parental_rating[i].i_country_code >> 8) & 0xff (p_decoded->p_parental_rating[i].i_country_code >> 8) & 0xf
; f;
p_descriptor->p_data[8 * i + 2] = p_descriptor->p_data[8 * i + 2] =
p_decoded->p_parental_rating[i].i_country_code & 0xff; p_decoded->p_parental_rating[i].i_country_code & 0xff;
p_descriptor->p_data[8 * i + 3] = p_descriptor->p_data[8 * i + 3] =
p_decoded->p_parental_rating[i].i_rating; p_decoded->p_parental_rating[i].i_rating;
} }
if(b_duplicate) if (b_duplicate)
{ {
/* Duplicate decoded data */ /* Duplicate decoded data */
dvbpsi_parental_rating_dr_t * p_dup_decoded = p_descriptor->p_decoded =
(dvbpsi_parental_rating_dr_t*)malloc(sizeof(dvbpsi_parental_rating_ dvbpsi_DuplicateDecodedDescriptor(p_decoded,
dr_t)); sizeof(dvbpsi_parental_ra
if(p_dup_decoded) ting_dr_t));
memcpy(p_dup_decoded, p_decoded, sizeof(dvbpsi_parental_rating_dr_t
));
p_descriptor->p_decoded = (void*)p_dup_decoded;
} }
}
return p_descriptor; return p_descriptor;
} }
 End of changes. 18 change blocks. 
78 lines changed or deleted 58 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/