123456789101112131415161718192021222324252627282930313233343536373839404142434445464748495051525354555657585960616263646566676869707172737475767778798081828384858687888990919293949596979899100101102103104105106107108109110111112113114115116117118119120121122123124125126127128129130131132133134135136137138139140141142143144145146147148149150151152153154155156157158159160161162163164165166167168169170171172173174175176177178179180181182183184185186187188189190191192193194195196197198199200201202203204205206207208209210211212213214215216217218219220221222223224225226227228229230231232233234235236237238239240241242243244245246247248249250251252253254255256257258259260261262263264265266267268269270271272273274275276277278279280281282283284285286287288289290291292293294295296297298299300301302303304305306307308309310311312313314315316317318319320321322323324325326327328329330331332333334335336337338339340341342343344345346347348349350351352353354355356357358359360361362363364365366367368369370371372373374375376377378379380381382383384385386387388389390391392393394395396397398399400401402403404405406407408409410411412413414415416417418419420421422423424425426427428429430431432433434435436437438439440441442443444445446447448449450451452453454455456457458459460461462463464465466467468469470471472473474475476477478479480481482483484485486487488489490491492493494495496497498499500501502503504505506507508509510511512513514 |
- /*
- * Copyright (c) 2011-2014 - Mauro Carvalho Chehab
- *
- * 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 version 2
- * of the License.
- *
- * 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.
- */
- #ifndef _DVB_FILE_H
- #define _DVB_FILE_H
- #include "dvb-fe.h"
- /**
- * @file dvb-file.h
- * @ingroup file
- * @brief Provides interfaces to deal with DVB channel and program files.
- * @copyright GNU General Public License version 2 (GPLv2)
- * @author Mauro Carvalho Chehab
- *
- * There are basically two types of files used for DVB:
- * - files that describe the physical channels (also called as transponders);
- * - files that describe the several programs found on a MPEG-TS (also called
- * as zap files).
- *
- * The libdvbv5 library defines an unified type for both types. Other
- * applications generally use different formats.
- *
- * The purpose of the functions and structures defined herein is to provide
- * support to read and write to those different formats.
- *
- * @par Bug Report
- * Please submit bug reports and patches to linux-media@vger.kernel.org
- */
- /*
- * DVB structures used to represent all files opened by the libdvbv5 library.
- *
- * Those structs represents each individual entry on a file, and the file
- * as a whole.
- */
- /**
- * @struct dvb_elementary_pid
- * @brief associates an elementary stream type with its PID
- * @ingroup file
- *
- * @param type Elementary stream type
- * @param pid Elementary stream Program ID
- */
- struct dvb_elementary_pid {
- uint8_t type;
- uint16_t pid;
- };
- /**
- * @struct dvb_entry
- * @brief Represents one entry on a DTV file
- * @ingroup file
- *
- * @param props A property key/value pair. The keys are the ones
- * specified at the DVB API, plus the ones defined
- * internally by libdvbv5, at the dvb-v5-std.h
- * header file.
- * @param next a pointer to the next entry. NULL if this is
- * the last one.
- * @param service_id Service ID associated with a program inside a
- * transponder. Please note that pure "channel"
- * files will have this field filled with 0.
- * @param video_pid Array with the video program IDs inside a service
- * @param audio_pid Array with the audio program IDs inside a service
- * @param other_el_pid Array with all non-audio/video program IDs
- * inside a service
- * @param video_pid_len Size of the video_pid array
- * @param audio_pid_len Size of the audio_pid array
- * @param other_el_pid_len Size of the other_el_pid array
- * @param channel String containing the name of the channel
- * @param vchannel String representing the Number of the channel
- * @param location String representing the location of the channel
- * @param sat_number For satellite streams, this represents the
- * number of the satellite dish on a DiSeqC
- * arrangement. Should be zero on arrangements
- * without DiSeqC.
- * @param freq_bpf SCR/Unicable band-pass filter frequency to
- * use, in kHz.
- * For non SRC/Unicable arrangements, it should
- * be zero.
- * @param diseqc_wait Extra time to wait for DiSeqC commands to
- * complete, in ms. The library will use 15 ms
- * as the minimal time,
- * plus the time specified on this field.
- * @param lnb String with the name of the LNBf to be used for
- * satellite tuning. The names should match the
- * names provided by dvb_sat_get_lnb() call
- * (see dvb-sat.h).
- */
- struct dvb_entry {
- struct dtv_property props[DTV_MAX_COMMAND];
- unsigned int n_props;
- struct dvb_entry *next;
- uint16_t service_id;
- uint16_t *video_pid, *audio_pid;
- struct dvb_elementary_pid *other_el_pid;
- unsigned video_pid_len, audio_pid_len, other_el_pid_len;
- char *channel;
- char *vchannel;
- char *location;
- int sat_number;
- unsigned freq_bpf;
- unsigned diseqc_wait;
- char *lnb;
- };
- /**
- * @struct dvb_file
- * @brief Describes an entire DVB file opened
- *
- * @param fname name of the file
- * @param n_entries number of the entries read
- * @param first_entry entry for the first entry. NULL if the file is empty.
- */
- struct dvb_file {
- char *fname;
- int n_entries;
- struct dvb_entry *first_entry;
- };
- /*
- * DVB file format tables
- *
- * The structs below are used to represent oneline formats like the ones
- * commonly found on DVB legacy applications.
- */
- /**
- * @struct dvb_parse_table
- * @brief Describes the fields to parse on a file
- * @ingroup file
- *
- * @param prop Name of the DVBv5 or libdvbv5 property field
- * @param table Name of a translation table for string to
- * int conversion
- * @param size Size of the translation table
- * @param mult_factor Multiply factor - Used, for example, to
- * multiply the symbol rate read from a DVB-S
- * table by 1000.
- * @param has_default_value It is different than zero when the property
- * can be optional. In this case, the next field
- * should be present
- * @param default_value Default value for the optional field
- */
- struct dvb_parse_table {
- unsigned int prop;
- const char **table;
- unsigned int size;
- int mult_factor;
- int has_default_value;
- int default_value;
- };
- /**
- * @struct dvb_parse_struct
- * @brief Describes the format to parse an specific delivery system
- * @ingroup file
- *
- * @param id String that identifies the delivery system on the
- * file to be parsed
- * @param delsys Delivery system
- * @param table the struct dvb_parse_table used to parse for this
- * specific delivery system
- * @param size Size of the table
- */
- struct dvb_parse_struct {
- char *id;
- uint32_t delsys;
- const struct dvb_parse_table *table;
- unsigned int size;
- };
- /**
- * @struct dvb_parse_file
- * @brief Describes an entire file format
- *
- * @param has_delsys_id A non-zero value indicates that the id field
- * at the formats vector should be used
- * @param delimiter Delimiters to split entries on the format
- * @param formats A struct dvb_parse_struct vector with the
- * per delivery system parsers. This table should
- * terminate with an empty entry.
- */
- struct dvb_parse_file {
- int has_delsys_id;
- char *delimiter;
- struct dvb_parse_struct formats[];
- };
- /**
- * @enum dvb_file_formats
- * @brief Known file formats
- * @ingroup file
- *
- * @details
- * Please notice that the channel format defined here has a few optional
- * fields that aren't part of the dvb-apps format, for DVB-S2 and for DVB-T2.
- * They're there to match the formats found at dtv-scan-tables package up to
- * September, 5 2014.
- *
- * @var FILE_UNKNOWN
- * @brief File format is unknown
- * @var FILE_ZAP
- * @brief File is at the dvb-apps "dvbzap" format
- * @var FILE_CHANNEL
- * @brief File is at the dvb-apps output format for dvb-zap
- * @var FILE_DVBV5
- * @brief File is at libdvbv5 format
- * @var FILE_VDR
- * @brief File is at DVR format (as supported on version 2.1.6).
- * Note: this is only supported as an output format.
- */
- enum dvb_file_formats {
- FILE_UNKNOWN,
- FILE_ZAP,
- FILE_CHANNEL,
- FILE_DVBV5,
- FILE_VDR,
- };
- struct dvb_v5_descriptors;
- #ifdef __cplusplus
- extern "C" {
- #endif
- /**
- * @brief Deallocates memory associated with a struct dvb_file
- * @ingroup file
- *
- * @param dvb_file dvb_file struct to be deallocated
- *
- * This function assumes that several functions were dynamically allocated
- * by the library file functions.
- */
- static inline void dvb_file_free(struct dvb_file *dvb_file)
- {
- struct dvb_entry *entry = dvb_file->first_entry, *next;
- while (entry) {
- next = entry->next;
- if (entry->channel)
- free(entry->channel);
- if (entry->vchannel)
- free(entry->vchannel);
- if (entry->location)
- free(entry->location);
- if (entry->video_pid)
- free(entry->video_pid);
- if (entry->audio_pid)
- free(entry->audio_pid);
- if (entry->other_el_pid)
- free(entry->other_el_pid);
- if (entry->lnb)
- free(entry->lnb);
- free(entry);
- entry = next;
- }
- free(dvb_file);
- }
- /*
- * File format description structures defined for the several formats that
- * the library can read natively.
- */
- /**
- * @brief File format definitions for dvb-apps channel format
- * @ingroup file
- */
- extern const struct dvb_parse_file channel_file_format;
- /**
- * @brief File format definitions for dvb-apps zap format
- * @ingroup file
- */
- extern const struct dvb_parse_file channel_file_zap_format;
- /*
- * Prototypes for the several functions defined at dvb-file.c
- */
- /**
- * @brief Read a file at libdvbv5 format
- * @ingroup file
- *
- * @param fname file name
- *
- * @return It returns a pointer to struct dvb_file describing the entries that
- * were read from the file. If it fails, NULL is returned.
- */
- struct dvb_file *dvb_read_file(const char *fname);
- /**
- * @brief Write a file at libdvbv5 format
- * @ingroup file
- *
- * @param fname file name
- * @param dvb_file contents of the file to be written
- *
- * @return It returns zero if success, or a positive error number if it fails.
- */
- int dvb_write_file(const char *fname, struct dvb_file *dvb_file);
- /**
- * @brief Read a file on any format natively supported by
- * the library
- * @ingroup file
- *
- * @param fname file name
- * @param delsys Delivery system, as specified by enum fe_delivery_system
- * @param format Name of the format to be read
- *
- * @return It returns a pointer to struct dvb_file describing the entries that
- * were read from the file. If it fails, NULL is returned.
- */
- struct dvb_file *dvb_read_file_format(const char *fname,
- uint32_t delsys,
- enum dvb_file_formats format);
- /**
- * @brief Write a file on any format natively supported by
- * the library
- * @ingroup file
- *
- * @param fname file name
- * @param dvb_file contents of the file to be written
- * @param delsys Delivery system, as specified by enum fe_delivery_system
- * @param format Name of the format to be read
- *
- * @return It a pointer to struct dvb_file on success, NULL otherwise.
- */
- int dvb_write_file_format(const char *fname,
- struct dvb_file *dvb_file,
- uint32_t delsys,
- enum dvb_file_formats format);
- /**
- * @brief Stores a key/value pair on a DVB file entry
- * @ingroup file
- *
- * @param entry entry to be filled
- * @param cmd key for the property to be used. It be one of the DVBv5
- * properties, plus the libdvbv5 ones, as defined at dvb-v5-std.h
- * @param value value for the property.
- *
- * This function seeks for a property with the name specified by cmd and
- * fills it with value. If the entry doesn't exist, it creates a new key.
- *
- * @return Returns 0 if success, or, if the entry has already DTV_MAX_COMMAND
- * properties, it returns -1.
- */
- int dvb_store_entry_prop(struct dvb_entry *entry,
- uint32_t cmd, uint32_t value);
- /**
- * @brief Retrieves the value associated witha key on a DVB file entry
- * @ingroup file
- *
- * @param entry entry to be used
- * @param cmd key for the property to be found. It be one of the DVBv5
- * properties, plus the libdvbv5 ones, as defined at dvb-v5-std.h
- * @param value pointer to store the value associated with the property.
- *
- * This function seeks for a property with the name specified by cmd and
- * fills value with its contents.
- *
- * @return Returns 0 if success, or, -1 if the entry doesn't exist.
- */
- int dvb_retrieve_entry_prop(struct dvb_entry *entry,
- uint32_t cmd, uint32_t *value);
- /**
- * @brief stored a new scanned channel into a dvb_file struct
- * @ingroup file
- *
- * @param dvb_file file struct to be filled
- * @param parms struct dvb_v5_fe_parms used by libdvbv5 frontend
- * @param dvb_desc struct dvb_desc as described at descriptors.h, filled
- * with the descriptors associated with a DVB channel.
- * those descriptors can be filled by calling one of the
- * scan functions defined at dvb-sat.h.
- * @param get_detected if different than zero, uses the frontend parameters
- * obtained from the device driver (such as modulation,
- * FEC, etc)
- * @param get_nit if true, uses the parameters obtained from the MPEG-TS
- * NIT table to add newly detected transponders.
- *
- * This function should be used to store the services found on a scanned
- * transponder. Initially, it copies the same parameters used to set the
- * frontend, that came from a file where the Service ID and Elementary Stream
- * PIDs are unknown. At tuning time, it is common to set the device to tune
- * on auto-detection mode (e. g. using QAM/AUTO, for example, to autodetect
- * the QAM modulation). The libdvbv5's logic will be to check the detected
- * values. So, the modulation might, for example, have changed to QAM/256.
- * In such case, if get_detected is 0, it will store QAM/AUTO at the struct.
- * If get_detected is different than zero, it will store QAM/256.
- * If get_nit is different than zero, and if the MPEG-TS has info about other
- * physical channels/transponders, this function will add newer entries to
- * dvb_file, for it to seek for new transponders. This is very useful especially
- * for DVB-C, where all transponders belong to the same operator. Knowing one
- * frequency is generally enough to get all DVB-C transponders.
- *
- * @return Returns 0 if success, or, -1 if error.
- */
- int dvb_store_channel(struct dvb_file **dvb_file,
- struct dvb_v5_fe_parms *parms,
- struct dvb_v5_descriptors *dvb_desc,
- int get_detected, int get_nit);
- /**
- * @brief Ancillary function that seeks for a delivery system
- * @ingroup file
- *
- * @param name string containing the name of the Delivery System to seek
- *
- * If the name is found, this function returns the DVBv5 property that
- * corresponds to the string given. The function is case-insensitive, and
- * it can check for alternate ways to write the name of a Delivery System.
- * Currently, it supports: DVB-C, DVB-H, DVB-S, DVB-S2, DVB-T, DVB-T2,
- * ISDB-C, ISDB-S, ISDB-T, ATSC-MH, DVBC/ANNEX_A, DVBC/ANNEX_B, DVBT, DSS,
- * DVBS, DVBS2, DVBH, ISDBT, ISDBS, ISDBC, ATSC, ATSCMH, DTMB, CMMB, DAB,
- * DVBT2, TURBO, DVBC/ANNEX_C.
- * Please notice that this doesn't mean that all those standards are properly
- * supported by the library.
- *
- * @return Returns the Delivery System property number if success, -1 if error.
- */
- int dvb_parse_delsys(const char *name);
- /**
- * @brief Ancillary function that parses the name of a file format
- * @ingroup file
- *
- * @param name string containing the name of the format
- * Current valid names are: ZAP, CHANNEL, VDR and DVBV5.
- * The name is case-insensitive.
- *
- * @return It returns FILE_ZAP, FILE_CHANNEL, FILE_VDR or FILE_DVBV5
- * if the name was translated. FILE_UNKNOWN otherwise.
- */
- enum dvb_file_formats dvb_parse_format(const char *name);
- /*
- * Routines to read a non-libdvbv5 format. They're called by
- * dvb_read_file_format() or dvb_write_file_format()
- */
- /**
- * @brief Read and parses a one line file format
- * @ingroup file
- *
- * @param fname file name
- * @param delsys delivery system
- * @param parse_file pointer struct dvb_parse_file
- *
- * @return It a pointer to struct dvb_file on success, NULL otherwise.
- *
- * This function is called internally by dvb_read_file_format.
- */
- struct dvb_file *dvb_parse_format_oneline(const char *fname,
- uint32_t delsys,
- const struct dvb_parse_file *parse_file);
- /**
- * @brief Writes a file into an one line file format
- * @ingroup file
- *
- * @param fname file name
- * @param dvb_file contents of the file to be written
- * @param delsys delivery system
- * @param parse_file pointer struct dvb_parse_file
- *
- * @return It returns zero if success, or a positive error number if it fails.
- *
- * This function is called internally by dvb_write_file_format.
- */
- int dvb_write_format_oneline(const char *fname,
- struct dvb_file *dvb_file,
- uint32_t delsys,
- const struct dvb_parse_file *parse_file);
- /**
- * @brief Writes a file into vdr format (compatible up to version 2.1)
- * @ingroup file
- *
- * @param fname file name
- * @param dvb_file contents of the file to be written
- *
- * @return It returns zero if success, or a positive error number if it fails.
- *
- * This function is called internally by dvb_write_file_format.
- */
- int dvb_write_format_vdr(const char *fname,
- struct dvb_file *dvb_file);
- #ifdef __cplusplus
- }
- #endif
- #endif // _DVB_FILE_H
|