File:  [DVB] / multiplexer / splice.h
Revision 1.11: download - view: text, annotated - select for diffs
Sat Jan 15 20:39:50 2005 UTC (19 years, 4 months ago) by oskar
Branches: MAIN
CVS tags: version-1-1-7, version-1-1-6, version-1-1-5, version-1-1-4, version-1-1-3, version-1-1-2, version-1-1-1, version-1-1-0, version-1-0-8, version-1-0-7, version-1-0-6, HEAD
add command --nit to control network pid in pat

/*
 * ISO 13818 stream multiplexer
 * Copyright (C) 2001 Convergence Integrated Media GmbH Berlin
 * Copyright (C) 2005 Oskar Schirmer (schirmer@scara.com)
 *
 * 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
 */

/* Local type to splice: To keep information on modification
 * of a descriptor, for which the stream has not yet begun.
 * Used in splice.c as a list.
 */
typedef struct modifydescrdescr {
  struct modifydescrdescr *next;
  int programnb;
  short sid;
  short pid;
  int dtag;
  int dlength;
  byte data[MAX_DESCR_LEN];
} modifydescr_descr;

extern t_msec next_psi_periodic;
extern t_msec psi_frequency_msec;
extern boolean psi_frequency_changed;

extern int configuration_on;
extern boolean configuration_changed;
extern boolean configuration_descr_changed;
extern const char *configuration_total;

#define configuration_must_print \
    (configuration_changed ? configuration_on != 0 : \
     configuration_descr_changed && (configuration_on > 1))

#define configuration_was_printed \
    (configuration_changed = FALSE, configuration_descr_changed = FALSE)

boolean splice_init (void);
stream_descr *connect_streamprog (file_descr *f,
    int programnb,
    int sourceid,
    int streamid,
    int streamtype,
    stream_descr *stream,
    stream_descr *mapstream,
    boolean mention);
void unlink_streamprog (stream_descr *s,
    prog_descr *p);
void remove_streamprog (stream_descr *s,
    prog_descr *p);
stream_descr *get_streamprog (prog_descr *p,
    int streamid);
int splice_findfreestreamid (prog_descr *p,
    int sid);
stream_descr *splice_findpcrstream (prog_descr *p);
void splice_set_configuration (int on);
void splice_one_configuration (prog_descr *p);
void splice_modifycheckmatch (int programnb,
    prog_descr *p,
    stream_descr *s,
    stump_descr *st);
void splice_modifytargetdescrprog (prog_descr *p,
    int programnb,
    short sid,
    short pid,
    int dtag,
    int dlength,
    byte *data,
    stump_descr *globstump);

/*
 * the following are specific to the splice type
 * and thus are provided in splice*.c :
 */

/* Determines, whether the spliced stream format supports more than 1 program:
 */
extern const boolean splice_multipleprograms;

boolean splice_specific_init (void);

/* Set the transport stream ID, if applicable:
 */
void splice_settransportstreamid (int tsid);

/* Set the PSI frequency in milliseconds. 0 denotes infinite.
 */
void splice_setpsifrequency (t_msec freq);

/* Set the network PID in a PAT
 */
void splice_setnetworkpid (short pid);

/* Print configuration for all target programs.
 */
void splice_all_configuration (void);

/* Get the program with the specified number.
 * Return: program, if found; NULL otherwise.
 */
prog_descr *splice_getprog (int programnb);

/* Open a program with the specified number.
 * If the program yet exists, don't open another one.
 * Return: program, if found or opened; NULL on error.
 */
prog_descr *splice_openprog (int programnb);

/* Close a program.
 * Unlink any streams that are still linked to the program.
 * Precondition: p!=NULL
 */
void splice_closeprog (prog_descr *p);

/* Add a stream to a program.
 * If !force_sid and the stream ID is occupied, try to find an equivalent one.
 * Precondition: p!=NULL, s!=NULL
 * Return: target ID > 0 on success, 0 or negative otherwise.
 */
int splice_addstream (prog_descr *p,
    stream_descr *s,
    boolean force_sid);

/* Delete a stream from a program.
 * Precondition: p!=NULL, s!=NULL
 * Return: TRUE on success, FALSE otherwise
 */
boolean splice_delstream (prog_descr *p,
    stream_descr *s);

/* Prepare to finish.
 * Generate any data needed to close the output stream cleanly.
 */
void process_finish (void);

/* Process data from a stream.
 * If it is a map stream, then it is a set of descriptors, so just
 * validate them. Otherwise, if PSI information is due, generate it.
 * Check whether there is enough space via output_pushdata, exit if not.
 * Compile one output package (whatever that might be) of the foreseen
 * size, and crop the consumed amount of payload data from the stream.
 * The stream payload data block now may be empty, but not necessarily is.
 * Precondition: s!=NULL, !list_empty(s->ctrl)
 * Return: NULL, if the stream data block is consumed completely and thus empty
 *         the stream s otherwise.
 */
stream_descr *process_something (stream_descr *s);

/* Add a range of unparsed si PIDs to a source file.
 * Check all PIDs covered for collision in the target stream.
 */
void splice_addsirange (file_descr *f,
    int lower,
    int upper);

/* Create a stump.
 * If it exists yet, change it, if the program does not yet exist,
 * store it into a global stump list.
 */
void splice_createstump (int programnb,
    short pid,
    byte styp);

/* Get all stumps for a given program (for pid<0) or get
 * a single stump for a given program and pid. Unchain these from
 * the list (global or prog) and return them as separate list.
 */
stump_descr *splice_getstumps (int programnb,
    short pid);

/* Modify an entry in a manudescr struct.
 * If programnb<0, modify all descriptors for all programs,
 * if pid==0, modify all descriptors (global and for all streams),
 * if sid<0 and pid<0, modify a global descriptor, non-stream-specific,
 * if pid>0, modify a descriptor for that stream (TS only),
 * if sid>=0, modify a descriptor for that stream,
 * if dtag<0, delete manual entries for all descriptors for the stream(s),
 * if dtag>=0 and dlength<0, delete one manual entry,
 * if dtag>=0 and dlength==0, inhibit auto propagation of this descriptor,
 * else add a manual entry.
 */
void splice_modifytargetdescriptor (int programnb,
    short sid,
    short pid,
    int dtag,
    int dlength,
    byte *data);



LinuxTV legacy CVS <linuxtv.org/cvs>