2008-04-14 04:09:29 +00:00
|
|
|
|
/*
|
|
|
|
|
* Functions for working PID/integer lists.
|
|
|
|
|
*
|
|
|
|
|
* ***** BEGIN LICENSE BLOCK *****
|
|
|
|
|
* Version: MPL 1.1
|
|
|
|
|
*
|
|
|
|
|
* The contents of this file are subject to the Mozilla Public License Version
|
|
|
|
|
* 1.1 (the "License"); you may not use this file except in compliance with
|
|
|
|
|
* the License. You may obtain a copy of the License at
|
|
|
|
|
* http://www.mozilla.org/MPL/
|
|
|
|
|
*
|
|
|
|
|
* Software distributed under the License is distributed on an "AS IS" basis,
|
|
|
|
|
* WITHOUT WARRANTY OF ANY KIND, either express or implied. See the License
|
|
|
|
|
* for the specific language governing rights and limitations under the
|
|
|
|
|
* License.
|
|
|
|
|
*
|
|
|
|
|
* The Original Code is the MPEG TS, PS and ES tools.
|
|
|
|
|
*
|
|
|
|
|
* The Initial Developer of the Original Code is Amino Communications Ltd.
|
|
|
|
|
* Portions created by the Initial Developer are Copyright (C) 2008
|
|
|
|
|
* the Initial Developer. All Rights Reserved.
|
|
|
|
|
*
|
|
|
|
|
* Contributor(s):
|
|
|
|
|
* Amino Communications Ltd, Swavesey, Cambridge UK
|
|
|
|
|
*
|
|
|
|
|
* ***** END LICENSE BLOCK *****
|
|
|
|
|
*/
|
|
|
|
|
|
|
|
|
|
#ifndef _pidint_fns
|
|
|
|
|
#define _pidint_fns
|
|
|
|
|
|
|
|
|
|
#include "pidint_defns.h"
|
|
|
|
|
|
|
|
|
|
// ============================================================================
|
|
|
|
|
// PIDINT LIST maintenance
|
|
|
|
|
// ============================================================================
|
|
|
|
|
/*
|
|
|
|
|
* Initialise a new pid/int list datastructure.
|
|
|
|
|
*/
|
|
|
|
|
extern int init_pidint_list(pidint_list_p list);
|
|
|
|
|
/*
|
|
|
|
|
* Build a new pid/int list datastructure.
|
|
|
|
|
*
|
|
|
|
|
* Returns 0 if it succeeds, 1 if some error occurs.
|
|
|
|
|
*/
|
|
|
|
|
extern int build_pidint_list(pidint_list_p *list);
|
|
|
|
|
/*
|
|
|
|
|
* Add a pid/integer pair to the end of the list
|
|
|
|
|
*
|
|
|
|
|
* Returns 0 if it succeeds, 1 if some error occurs.
|
|
|
|
|
*/
|
|
|
|
|
extern int append_to_pidint_list(pidint_list_p list,
|
2008-10-18 15:04:34 +00:00
|
|
|
|
uint32_t pid,
|
2008-04-14 04:09:29 +00:00
|
|
|
|
int program);
|
|
|
|
|
/*
|
|
|
|
|
* Remove a pid/integer pair from the list
|
|
|
|
|
*
|
|
|
|
|
* Returns 0 if it succeeds, 1 if some error occurs.
|
|
|
|
|
*/
|
|
|
|
|
extern int remove_from_pidint_list(pidint_list_p list,
|
2008-10-18 15:04:34 +00:00
|
|
|
|
uint32_t pid);
|
2008-04-14 04:09:29 +00:00
|
|
|
|
/*
|
|
|
|
|
* Tidy up and free a pid/int list datastructure after we've finished with it
|
|
|
|
|
*
|
|
|
|
|
* Clears the datastructure, frees it and returns `list` as NULL.
|
|
|
|
|
*
|
|
|
|
|
* Does nothing if `list` is already NULL.
|
|
|
|
|
*/
|
|
|
|
|
extern void free_pidint_list(pidint_list_p *list);
|
|
|
|
|
/*
|
|
|
|
|
* Report on a pid/int list's contents
|
|
|
|
|
*/
|
|
|
|
|
extern void report_pidint_list(pidint_list_p list,
|
|
|
|
|
char *list_name,
|
|
|
|
|
char *int_name,
|
|
|
|
|
int pid_first);
|
|
|
|
|
/*
|
|
|
|
|
* Lookup a PID to find the corresponding integer value in a pid/int list.
|
|
|
|
|
*
|
|
|
|
|
* Returns 0 if the PID is in the list, -1 if it is not.
|
|
|
|
|
*/
|
|
|
|
|
extern int pid_int_in_pidint_list(pidint_list_p list,
|
2008-10-18 15:04:34 +00:00
|
|
|
|
uint32_t pid,
|
2008-04-14 04:09:29 +00:00
|
|
|
|
int *number);
|
|
|
|
|
/*
|
|
|
|
|
* Lookup a PID to find its index in a pid/int list.
|
|
|
|
|
*
|
|
|
|
|
* Note that if `list` is NULL, then -1 will be returned - this is to
|
|
|
|
|
* allow the caller to make a query before they have read a list from the
|
|
|
|
|
* bitstream.
|
|
|
|
|
*
|
|
|
|
|
* Returns its index (0 or more) if the PID is in the list, -1 if it is not.
|
|
|
|
|
*/
|
|
|
|
|
extern int pid_index_in_pidint_list(pidint_list_p list,
|
2008-10-18 15:04:34 +00:00
|
|
|
|
uint32_t pid);
|
2008-04-14 04:09:29 +00:00
|
|
|
|
/*
|
|
|
|
|
* Lookup a PID to see if it is in a pid/int list.
|
|
|
|
|
*
|
|
|
|
|
* Note that if `list` is NULL, then FALSE will be returned - this is to
|
|
|
|
|
* allow the caller to make a query before they have read a list from the
|
|
|
|
|
* bitstream.
|
|
|
|
|
*
|
|
|
|
|
* Returns TRUE if the PID is in the list, FALSE if it is not.
|
|
|
|
|
*/
|
|
|
|
|
extern int pid_in_pidint_list(pidint_list_p list,
|
2008-10-18 15:04:34 +00:00
|
|
|
|
uint32_t pid);
|
2008-04-14 04:09:29 +00:00
|
|
|
|
/*
|
|
|
|
|
* Check if two pid/int lists have the same content.
|
|
|
|
|
*
|
|
|
|
|
* Note that:
|
|
|
|
|
*
|
|
|
|
|
* - a list always compares as the same as itself
|
|
|
|
|
* - two NULL lists compare as the same
|
|
|
|
|
* - the *order* of PID/int pairs in the lists does not matter
|
|
|
|
|
*
|
|
|
|
|
* Returns TRUE if the two have the same content, FALSE otherwise.
|
|
|
|
|
*/
|
|
|
|
|
extern int same_pidint_list(pidint_list_p list1,
|
|
|
|
|
pidint_list_p list2);
|
|
|
|
|
/*
|
|
|
|
|
* Report on a program stream list (a specialisation of report_pidint_list).
|
|
|
|
|
*
|
|
|
|
|
* - `list` is the stream list to report on
|
|
|
|
|
* - `prefix` is NULL or a string to put before each line printed
|
|
|
|
|
*/
|
|
|
|
|
extern void report_stream_list(pidint_list_p list,
|
|
|
|
|
char *prefix);
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
// ============================================================================
|
|
|
|
|
// PMT data maintenance
|
|
|
|
|
// ============================================================================
|
|
|
|
|
/*
|
|
|
|
|
* Build a new PMT datastructure.
|
|
|
|
|
*
|
|
|
|
|
* `version_number` should be in the range 0-31, and will be treated as a
|
|
|
|
|
* number modulo 32 if it is not.
|
|
|
|
|
*
|
|
|
|
|
* `PCR_pid` should be a legitimate PCR PID - i.e., in the range 0x0010 to
|
|
|
|
|
* 0x1FFE, or 0x1FFF to indicate "unset". However, for convenience, the
|
|
|
|
|
* value 0 will also be accepted, and converted to 0x1FFF.
|
|
|
|
|
*
|
|
|
|
|
* Returns (a pointer to) the new PMT datastructure, or NULL if some error
|
|
|
|
|
* occurs.
|
|
|
|
|
*/
|
2008-10-18 15:04:34 +00:00
|
|
|
|
extern pmt_p build_pmt(uint16_t program_number, byte version_number,
|
|
|
|
|
uint32_t PCR_pid);
|
2008-04-14 04:09:29 +00:00
|
|
|
|
/*
|
|
|
|
|
* Set the descriptor data on a PMT. Specifically, 'program info',
|
|
|
|
|
* the descriptor data in the PMT "as a whole".
|
|
|
|
|
*
|
|
|
|
|
* Any previous program information for this PMT is lost.
|
|
|
|
|
*
|
|
|
|
|
* A copy of the program information bytes is taken.
|
|
|
|
|
*
|
|
|
|
|
* Returns 0 if it succeeds, 1 if some error occurs.
|
|
|
|
|
*/
|
|
|
|
|
extern int set_pmt_program_info(pmt_p pmt,
|
2008-10-18 15:04:34 +00:00
|
|
|
|
uint16_t program_info_length,
|
2008-04-14 04:09:29 +00:00
|
|
|
|
byte *program_info);
|
|
|
|
|
/*
|
|
|
|
|
* Add a program stream to a PMT datastructure
|
|
|
|
|
*
|
|
|
|
|
* If `ES_info_length` is greater than 0, then `ES_info` is copied.
|
|
|
|
|
*
|
|
|
|
|
* Returns 0 if it succeeds, 1 if some error occurs.
|
|
|
|
|
*/
|
|
|
|
|
extern int add_stream_to_pmt(pmt_p pmt,
|
2008-10-18 15:04:34 +00:00
|
|
|
|
uint32_t elementary_PID,
|
2008-04-14 04:09:29 +00:00
|
|
|
|
byte stream_type,
|
2008-10-18 15:04:34 +00:00
|
|
|
|
uint16_t ES_info_length,
|
2008-04-14 04:09:29 +00:00
|
|
|
|
byte *ES_info);
|
|
|
|
|
/*
|
|
|
|
|
* Remove a program stream from a PMT.
|
|
|
|
|
*
|
|
|
|
|
* Returns 0 if it succeeds, 1 if some error occurs.
|
|
|
|
|
*/
|
|
|
|
|
extern int remove_stream_from_pmt(pmt_p pmt,
|
2008-10-18 15:04:34 +00:00
|
|
|
|
uint32_t pid);
|
2008-04-14 04:09:29 +00:00
|
|
|
|
/*
|
|
|
|
|
* Tidy up and free a PMT datastructure after we've finished with it
|
|
|
|
|
*
|
|
|
|
|
* Clears the datastructure, frees it and returns `pmt` as NULL.
|
|
|
|
|
*
|
|
|
|
|
* Does nothing if `pmt` is already NULL.
|
|
|
|
|
*/
|
|
|
|
|
extern void free_pmt(pmt_p *pmt);
|
|
|
|
|
/*
|
|
|
|
|
* Lookup a PID to find its index in a PMT datastructure.
|
|
|
|
|
*
|
|
|
|
|
* Note that if `pmt` is NULL, then -1 will be returned.
|
|
|
|
|
*
|
|
|
|
|
* Returns its index (0 or more) if the PID is in the list, -1 if it is not.
|
|
|
|
|
*/
|
|
|
|
|
extern int pid_index_in_pmt(pmt_p pmt,
|
2008-10-18 15:04:34 +00:00
|
|
|
|
uint32_t pid);
|
2008-04-14 04:09:29 +00:00
|
|
|
|
/*
|
|
|
|
|
* Lookup a PID to find the corresponding program stream information.
|
|
|
|
|
*
|
|
|
|
|
* Returns a pointer to the stream information if the PID is in the list,
|
|
|
|
|
* NULL if it is not.
|
|
|
|
|
*/
|
|
|
|
|
extern pmt_stream_p pid_stream_in_pmt(pmt_p pmt,
|
2008-10-18 15:04:34 +00:00
|
|
|
|
uint32_t pid);
|
2008-04-14 04:09:29 +00:00
|
|
|
|
/*
|
|
|
|
|
* Lookup a PID to see if it is in a PMT datastructure.
|
|
|
|
|
*
|
|
|
|
|
* Note that if `pmt` is NULL, then FALSE will be returned.
|
|
|
|
|
*
|
|
|
|
|
* Returns TRUE if the PID is in the PMT's stream list, FALSE if it is not.
|
|
|
|
|
*/
|
|
|
|
|
extern int pid_in_pmt(pmt_p pmt,
|
2008-10-18 15:04:34 +00:00
|
|
|
|
uint32_t pid);
|
2008-04-14 04:09:29 +00:00
|
|
|
|
/*
|
|
|
|
|
* Check if two PMT datastructures have the same content.
|
|
|
|
|
*
|
|
|
|
|
* Note that:
|
|
|
|
|
*
|
|
|
|
|
* - a PMT datastructure always compares as the same as itself
|
|
|
|
|
* - two NULL datastructures compare as the same
|
|
|
|
|
* - the *order* of program streams in the PMTs does not matter
|
|
|
|
|
* - descriptors must be identical as well, and byte order therein
|
|
|
|
|
* does matter (this may need changing later on)
|
|
|
|
|
*
|
|
|
|
|
* Returns TRUE if the two have the same content, FALSE otherwise.
|
|
|
|
|
*/
|
|
|
|
|
extern int same_pmt(pmt_p pmt1,
|
|
|
|
|
pmt_p pmt2);
|
|
|
|
|
/*
|
|
|
|
|
* Report on a PMT datastructure.
|
|
|
|
|
*
|
2009-05-03 20:08:52 +00:00
|
|
|
|
* - if `is_msg`, report as a message, otherwise as an error
|
2008-04-14 04:09:29 +00:00
|
|
|
|
* - `prefix` is NULL or a string to put before each line printed
|
|
|
|
|
* - `pmt` is the PMT to report on
|
|
|
|
|
*/
|
2009-05-03 20:08:52 +00:00
|
|
|
|
extern void report_pmt(int is_msg,
|
2008-04-14 04:09:29 +00:00
|
|
|
|
char *prefix,
|
|
|
|
|
pmt_p pmt);
|
|
|
|
|
|
|
|
|
|
#endif // _pidint_fns
|
2008-06-14 16:05:00 +00:00
|
|
|
|
|
|
|
|
|
// Local Variables:
|
|
|
|
|
// tab-width: 8
|
|
|
|
|
// indent-tabs-mode: nil
|
|
|
|
|
// c-basic-offset: 2
|
|
|
|
|
// End:
|
|
|
|
|
// vim: set tabstop=8 shiftwidth=2 expandtab:
|