Message ID | 1388245561-8751-3-git-send-email-neolynx@gmail.com (mailing list archive) |
---|---|
State | New, archived |
Headers | show |
Em Sat, 28 Dec 2013 16:45:51 +0100 André Roth <neolynx@gmail.com> escreveu: > Signed-off-by: André Roth <neolynx@gmail.com> > --- > lib/include/descriptors/mpeg_es.h | 109 ++++++++++++++++++++++++++++++ > lib/include/descriptors/mpeg_pes.h | 112 ++++++++++++++++++++++++++++++ > lib/include/descriptors/mpeg_ts.h | 79 ++++++++++++++++++++++ > lib/include/descriptors/nit.h | 4 +- > lib/libdvbv5/Makefile.am | 5 +- > lib/libdvbv5/descriptors/mpeg_es.c | 76 +++++++++++++++++++++ > lib/libdvbv5/descriptors/mpeg_pes.c | 131 ++++++++++++++++++++++++++++++++++++ > lib/libdvbv5/descriptors/mpeg_ts.c | 77 +++++++++++++++++++++ > 8 files changed, 590 insertions(+), 3 deletions(-) > create mode 100644 lib/include/descriptors/mpeg_es.h > create mode 100644 lib/include/descriptors/mpeg_pes.h > create mode 100644 lib/include/descriptors/mpeg_ts.h > create mode 100644 lib/libdvbv5/descriptors/mpeg_es.c > create mode 100644 lib/libdvbv5/descriptors/mpeg_pes.c > create mode 100644 lib/libdvbv5/descriptors/mpeg_ts.c > > diff --git a/lib/include/descriptors/mpeg_es.h b/lib/include/descriptors/mpeg_es.h > new file mode 100644 > index 0000000..1a74c90 > --- /dev/null > +++ b/lib/include/descriptors/mpeg_es.h > @@ -0,0 +1,109 @@ > +/* > + * Copyright (c) 2012 - Andre Roth <neolynx@gmail.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 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. > + * > + * 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., 51 Franklin Street, Fifth Floor, Boston, MA 02110-1301 USA > + * Or, point your browser to http://www.gnu.org/licenses/old-licenses/gpl-2.0.html > + * > + */ > + > +#ifndef _MPEG_ES_H > +#define _MPEG_ES_H > + > +#include <stdint.h> > +#include <unistd.h> /* ssize_t */ > + > +#define DVB_MPEG_ES_PIC_START 0x00 > +#define DVB_MPEG_ES_USER_DATA 0xb2 > +#define DVB_MPEG_ES_SEQ_START 0xb3 > +#define DVB_MPEG_ES_SEQ_EXT 0xb5 > +#define DVB_MPEG_ES_GOP 0xb8 > +#define DVB_MPEG_ES_SLICES 0x01 ... 0xaf > + > +struct dvb_mpeg_es_seq_start { > + union { > + uint32_t bitfield; > + struct { > + uint32_t type:8; > + uint32_t sync:24; > + } __attribute__((packed)); > + } __attribute__((packed)); > + union { > + uint32_t bitfield2; > + struct { > + uint32_t framerate:4; > + uint32_t aspect:4; > + uint32_t height:12; > + uint32_t width:12; > + } __attribute__((packed)); > + }; > + union { > + uint32_t bitfield3; > + struct { > + uint32_t qm_nonintra:1; > + uint32_t qm_intra:1; > + uint32_t constrained:1; > + uint32_t vbv:10; // Size of video buffer verifier = 16*1024*vbv buf size > + uint32_t one:1; > + uint32_t bitrate:18; > + } __attribute__((packed)); > + }; > +} __attribute__((packed)); > + > +struct dvb_mpeg_es_pic_start { > + union { > + uint32_t bitfield; > + struct { > + uint32_t type:8; > + uint32_t sync:24; > + } __attribute__((packed)); > + } __attribute__((packed)); > + union { > + uint32_t bitfield2; > + struct { > + uint32_t dummy:3; > + uint32_t vbv_delay:16; > + uint32_t coding_type:3; > + uint32_t temporal_ref:10; > + } __attribute__((packed)); > + }; > +} __attribute__((packed)); > + > +enum dvb_mpeg_es_frame_t > +{ > + DVB_MPEG_ES_FRAME_UNKNOWN, > + DVB_MPEG_ES_FRAME_I, > + DVB_MPEG_ES_FRAME_P, > + DVB_MPEG_ES_FRAME_B, > + DVB_MPEG_ES_FRAME_D > +}; > +extern const char *dvb_mpeg_es_frame_names[5]; > + > +struct dvb_v5_fe_parms; > + > +#ifdef __cplusplus > +extern "C" { > +#endif > + > +int dvb_mpeg_es_seq_start_init (const uint8_t *buf, ssize_t buflen, struct dvb_mpeg_es_seq_start *seq_start); > +void dvb_mpeg_es_seq_start_print(struct dvb_v5_fe_parms *parms, struct dvb_mpeg_es_seq_start *seq_start); > + > +int dvb_mpeg_es_pic_start_init (const uint8_t *buf, ssize_t buflen, struct dvb_mpeg_es_pic_start *pic_start); > +void dvb_mpeg_es_pic_start_print(struct dvb_v5_fe_parms *parms, struct dvb_mpeg_es_pic_start *pic_start); > + > +#ifdef __cplusplus > +} > +#endif > + > +#endif > diff --git a/lib/include/descriptors/mpeg_pes.h b/lib/include/descriptors/mpeg_pes.h > new file mode 100644 > index 0000000..e495f44 > --- /dev/null > +++ b/lib/include/descriptors/mpeg_pes.h > @@ -0,0 +1,112 @@ > +/* > + * Copyright (c) 2011-2012 - Mauro Carvalho Chehab <mchehab@redhat.com> Thanks, but I'm not the author of this code ;) > + * Copyright (c) 2012 - Andre Roth <neolynx@gmail.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 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. > + * > + * 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., 51 Franklin Street, Fifth Floor, Boston, MA 02110-1301 USA > + * Or, point your browser to http://www.gnu.org/licenses/old-licenses/gpl-2.0.html > + * > + */ > + > +#ifndef _MPEG_PES_H > +#define _MPEG_PES_H > + > +#include <stdint.h> > +#include <unistd.h> /* ssize_t */ > + > +#define DVB_MPEG_PES 0x00001 > +#define DVB_MPEG_PES_VIDEO 0xe0 ... 0xef > + > +#define DVB_MPEG_STREAM_MAP 0xBC > +#define DVB_MPEG_STREAM_PADDING 0xBE > +#define DVB_MPEG_STREAM_PRIVATE_2 0x5F > +#define DVB_MPEG_STREAM_ECM 0x70 > +#define DVB_MPEG_STREAM_EMM 0x71 > +#define DVB_MPEG_STREAM_DIRECTORY 0xFF > +#define DVB_MPEG_STREAM_DSMCC 0x7A > +#define DVB_MPEG_STREAM_H222E 0xF8 > + > +struct ts_t { > + uint8_t one:1; > + uint8_t bits30:3; > + uint8_t tag:4; > + > + union { > + uint16_t bitfield; > + struct { > + uint16_t one1:1; > + uint16_t bits15:15; > + } __attribute__((packed)); > + } __attribute__((packed)); > + > + union { > + uint16_t bitfield2; > + struct { > + uint16_t one2:1; > + uint16_t bits00:15; > + } __attribute__((packed)); > + } __attribute__((packed)); > +} __attribute__((packed)); > + > +struct dvb_mpeg_pes_optional { > + union { > + uint16_t bitfield; > + struct { > + uint16_t PES_extension:1; > + uint16_t PES_CRC:1; > + uint16_t additional_copy_info:1; > + uint16_t DSM_trick_mode:1; > + uint16_t ES_rate:1; > + uint16_t ESCR:1; > + uint16_t PTS_DTS:2; > + uint16_t original_or_copy:1; > + uint16_t copyright:1; > + uint16_t data_alignment_indicator:1; > + uint16_t PES_priority:1; > + uint16_t PES_scrambling_control:2; > + uint16_t two:2; > + } __attribute__((packed)); > + } __attribute__((packed)); > + uint8_t length; > + uint64_t pts; > + uint64_t dts; > +} __attribute__((packed)); > + > +struct dvb_mpeg_pes { > + union { > + uint32_t bitfield; > + struct { > + uint32_t stream_id:8; > + uint32_t sync:24; > + } __attribute__((packed)); > + } __attribute__((packed)); > + uint16_t length; > + struct dvb_mpeg_pes_optional optional[]; > +} __attribute__((packed)); > + > +struct dvb_v5_fe_parms; > + > +#ifdef __cplusplus > +extern "C" { > +#endif > + > +void dvb_mpeg_pes_init (struct dvb_v5_fe_parms *parms, const uint8_t *buf, ssize_t buflen, uint8_t *table, ssize_t *table_length); > +void dvb_mpeg_pes_free(struct dvb_mpeg_pes *ts); > +void dvb_mpeg_pes_print(struct dvb_v5_fe_parms *parms, struct dvb_mpeg_pes *ts); > + > +#ifdef __cplusplus > +} > +#endif > + > +#endif > diff --git a/lib/include/descriptors/mpeg_ts.h b/lib/include/descriptors/mpeg_ts.h > new file mode 100644 > index 0000000..2bb570b > --- /dev/null > +++ b/lib/include/descriptors/mpeg_ts.h > @@ -0,0 +1,79 @@ > +/* > + * Copyright (c) 2011-2012 - Mauro Carvalho Chehab <mchehab@redhat.com> I'm not the author ;) > + * Copyright (c) 2012 - Andre Roth <neolynx@gmail.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 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. > + * > + * 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., 51 Franklin Street, Fifth Floor, Boston, MA 02110-1301 USA > + * Or, point your browser to http://www.gnu.org/licenses/old-licenses/gpl-2.0.html > + * > + */ > + > +#ifndef _MPEG_TS_H > +#define _MPEG_TS_H > + > +#include <stdint.h> > +#include <unistd.h> /* ssize_t */ > + > +#define DVB_MPEG_TS 0x47 > + > +struct dvb_mpeg_ts_adaption { > + uint8_t length; > + struct { > + uint8_t extension:1; > + uint8_t private_data:1; > + uint8_t splicing_point:1; > + uint8_t OPCR:1; > + uint8_t PCR:1; > + uint8_t priority:1; > + uint8_t random_access:1; > + uint8_t discontinued:1; > + } __attribute__((packed)); > + > +} __attribute__((packed)); > + > +struct dvb_mpeg_ts { > + uint8_t sync_byte; // DVB_MPEG_TS > + union { > + uint16_t bitfield; > + struct { > + uint16_t pid:13; > + uint16_t priority:1; > + uint16_t payload_start:1; > + uint16_t tei:1; > + } __attribute__((packed)); > + }; > + struct { > + uint8_t continuity_counter:4; > + uint8_t adaptation_field:2; > + uint8_t scrambling:2; > + } __attribute__((packed)); > + struct dvb_mpeg_ts_adaption adaption[]; > + > +} __attribute__((packed)); > + > +struct dvb_v5_fe_parms; > + > +#ifdef __cplusplus > +extern "C" { > +#endif > + > +void dvb_mpeg_ts_init (struct dvb_v5_fe_parms *parms, const uint8_t *buf, ssize_t buflen, uint8_t *table, ssize_t *table_length); > +void dvb_mpeg_ts_free(struct dvb_mpeg_ts *ts); > +void dvb_mpeg_ts_print(struct dvb_v5_fe_parms *parms, struct dvb_mpeg_ts *ts); > + > +#ifdef __cplusplus > +} > +#endif > + > +#endif > diff --git a/lib/include/descriptors/nit.h b/lib/include/descriptors/nit.h > index f2f6163..d71a762 100644 > --- a/lib/include/descriptors/nit.h > +++ b/lib/include/descriptors/nit.h > @@ -48,7 +48,7 @@ struct dvb_table_nit_transport { > struct { > uint16_t section_length:12; > uint16_t reserved:4; > - }; > + } __attribute__((packed)); > }; > struct dvb_desc *descriptor; > struct dvb_table_nit_transport *next; > @@ -61,7 +61,7 @@ struct dvb_table_nit { > struct { > uint16_t desc_length:12; > uint16_t reserved:4; > - }; > + } __attribute__((packed)); > }; > struct dvb_desc *descriptor; > struct dvb_table_nit_transport *transport; Those changes on nit would be better on a separate fixup patch. > diff --git a/lib/libdvbv5/Makefile.am b/lib/libdvbv5/Makefile.am > index 400af39..795f30c 100644 > --- a/lib/libdvbv5/Makefile.am > +++ b/lib/libdvbv5/Makefile.am > @@ -49,7 +49,10 @@ libdvbv5_la_SOURCES = \ > descriptors/sdt.c ../include/descriptors/sdt.h \ > descriptors/vct.c ../include/descriptors/vct.h \ > descriptors/vct.c ../include/descriptors/vct.h \ > - descriptors/desc_service_location.c ../include/descriptors/desc_service_location.h > + descriptors/desc_service_location.c ../include/descriptors/desc_service_location.h \ > + descriptors/mpeg_ts.c ../include/descriptors/mpeg_ts.h \ > + descriptors/mpeg_pes.c ../include/descriptors/mpeg_pes.h \ > + descriptors/mpeg_es.c ../include/descriptors/mpeg_es.h > > libdvbv5_la_CPPFLAGS = $(ENFORCE_LIBDVBV5_STATIC) > libdvbv5_la_LDFLAGS = $(LIBDVBV5_VERSION) $(ENFORCE_LIBDVBV5_STATIC) -lm > diff --git a/lib/libdvbv5/descriptors/mpeg_es.c b/lib/libdvbv5/descriptors/mpeg_es.c > new file mode 100644 > index 0000000..b081af4 > --- /dev/null > +++ b/lib/libdvbv5/descriptors/mpeg_es.c > @@ -0,0 +1,76 @@ > +/* > + * Copyright (c) 2012 - Andre Roth <neolynx@gmail.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 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. > + * > + * 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., 51 Franklin Street, Fifth Floor, Boston, MA 02110-1301 USA > + * Or, point your browser to http://www.gnu.org/licenses/old-licenses/gpl-2.0.html > + * > + */ > + > +#include "descriptors/mpeg_es.h" > +#include "descriptors.h" > +#include "dvb-fe.h" > + > +int dvb_mpeg_es_seq_start_init(const uint8_t *buf, ssize_t buflen, struct dvb_mpeg_es_seq_start *seq_start) > +{ > + if(buflen < sizeof(struct dvb_mpeg_es_seq_start)) > + return -1; > + memcpy(seq_start, buf, sizeof(struct dvb_mpeg_es_seq_start)); > + bswap32(seq_start->bitfield); > + bswap32(seq_start->bitfield2); > + bswap32(seq_start->bitfield3); > + return 0; > +} > + > +void dvb_mpeg_es_seq_start_print(struct dvb_v5_fe_parms *parms, struct dvb_mpeg_es_seq_start *seq_start) > +{ > + dvb_log("MPEG ES SEQ START"); > + dvb_log(" - width %d", seq_start->width); > + dvb_log(" - height %d", seq_start->height); > + dvb_log(" - aspect %d", seq_start->aspect); > + dvb_log(" - framerate %d", seq_start->framerate); > + dvb_log(" - bitrate %d", seq_start->bitrate); > + dvb_log(" - one %d", seq_start->one); > + dvb_log(" - vbv %d", seq_start->vbv); > + dvb_log(" - constrained %d", seq_start->constrained); > + dvb_log(" - qm_intra %d", seq_start->qm_intra); > + dvb_log(" - qm_nonintra %d", seq_start->qm_nonintra); It seems that you're using spaces to indent. Please use tabs instead, where a tab means 8 positions. > +} > + > +const char *dvb_mpeg_es_frame_names[5] = { > + "?", > + "I", > + "P", > + "B", > + "D" > +}; > + > +int dvb_mpeg_es_pic_start_init(const uint8_t *buf, ssize_t buflen, struct dvb_mpeg_es_pic_start *pic_start) > +{ > + if(buflen < sizeof(struct dvb_mpeg_es_pic_start)) > + return -1; > + memcpy(pic_start, buf, sizeof(struct dvb_mpeg_es_pic_start)); > + bswap32(pic_start->bitfield); > + bswap32(pic_start->bitfield2); > + return 0; > +} > + > +void dvb_mpeg_es_pic_start_print(struct dvb_v5_fe_parms *parms, struct dvb_mpeg_es_pic_start *pic_start) > +{ > + dvb_log("MPEG ES PIC START"); > + dvb_log(" - temporal_ref %d", pic_start->temporal_ref); > + dvb_log(" - coding_type %d (%s-frame)", pic_start->coding_type, dvb_mpeg_es_frame_names[pic_start->coding_type]); > + dvb_log(" - vbv_delay %d", pic_start->vbv_delay); > +} > + > diff --git a/lib/libdvbv5/descriptors/mpeg_pes.c b/lib/libdvbv5/descriptors/mpeg_pes.c > new file mode 100644 > index 0000000..c717297 > --- /dev/null > +++ b/lib/libdvbv5/descriptors/mpeg_pes.c > @@ -0,0 +1,131 @@ > +/* > + * Copyright (c) 2012 - Andre Roth <neolynx@gmail.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 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. > + * > + * 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., 51 Franklin Street, Fifth Floor, Boston, MA 02110-1301 USA > + * Or, point your browser to http://www.gnu.org/licenses/old-licenses/gpl-2.0.html > + * > + */ > + > +#include "descriptors/mpeg_pes.h" > +#include "descriptors.h" > +#include "dvb-fe.h" > + > +void dvb_mpeg_pes_init(struct dvb_v5_fe_parms *parms, const uint8_t *buf, ssize_t buflen, uint8_t *table, ssize_t *table_length) > +{ > + struct dvb_mpeg_pes *pes = (struct dvb_mpeg_pes *) (table + *table_length); > + const uint8_t *p = buf; Add a blank line here. > + memcpy(table + *table_length, p, sizeof(struct dvb_mpeg_pes)); Please check for buflen before copying. > + p += sizeof(struct dvb_mpeg_pes); > + *table_length += sizeof(struct dvb_mpeg_pes); > + > + bswap32(pes->bitfield); > + bswap16(pes->length); > + > + if (pes->sync != 0x000001 ) { > + dvb_logerr("mpeg pes invalid"); > + return; > + } > + > + if (pes->stream_id == DVB_MPEG_STREAM_PADDING) { > + dvb_logwarn("mpeg pes padding stream ignored"); > + } else if (pes->stream_id == DVB_MPEG_STREAM_MAP || > + pes->stream_id == DVB_MPEG_STREAM_PRIVATE_2 || > + pes->stream_id == DVB_MPEG_STREAM_ECM || > + pes->stream_id == DVB_MPEG_STREAM_EMM || > + pes->stream_id == DVB_MPEG_STREAM_DIRECTORY || > + pes->stream_id == DVB_MPEG_STREAM_DSMCC || > + pes->stream_id == DVB_MPEG_STREAM_H222E ) { > + dvb_logerr("mpeg pes: unsupported stream type %#04x", pes->stream_id); > + } else { > + memcpy(pes->optional, p, sizeof(struct dvb_mpeg_pes_optional) - > + sizeof(pes->optional->pts) - > + sizeof(pes->optional->dts)); Please use offset_of() instead of those ugly sizeof(). > + p += sizeof(struct dvb_mpeg_pes_optional) - > + sizeof(pes->optional->pts) - > + sizeof(pes->optional->dts); > + bswap16(pes->optional->bitfield); > + pes->optional->pts = 0; > + pes->optional->dts = 0; > + if (pes->optional->PTS_DTS & 2) { > + struct ts_t pts; > + memcpy(&pts, p, sizeof(pts)); Please verify buflen before copy. I suggest you to take a look on how I did at the NIT table parser, for an example. > + p += sizeof(pts); > + bswap16(pts.bitfield); > + bswap16(pts.bitfield2); > + if (pts.one != 1 || pts.one1 != 1 || pts.one2 != 1) > + dvb_logwarn("mpeg pes: invalid pts"); > + else { > + pes->optional->pts |= (uint64_t) pts.bits00; > + pes->optional->pts |= (uint64_t) pts.bits15 << 15; > + pes->optional->pts |= (uint64_t) pts.bits30 << 30; > + } > + } > + if (pes->optional->PTS_DTS & 1) { > + struct ts_t dts; > + memcpy(&dts, p, sizeof(dts)); Again, please check before copying. > + p += sizeof(dts); > + bswap16(dts.bitfield); > + bswap16(dts.bitfield2); > + pes->optional->dts |= (uint64_t) dts.bits00; > + pes->optional->dts |= (uint64_t) dts.bits15 << 15; > + pes->optional->dts |= (uint64_t) dts.bits30 << 30; > + } > + *table_length += sizeof(struct dvb_mpeg_pes_optional); > + } > +} > + > +void dvb_mpeg_pes_free(struct dvb_mpeg_pes *ts) > +{ > + free(ts); > +} > + > +void dvb_mpeg_pes_print(struct dvb_v5_fe_parms *parms, struct dvb_mpeg_pes *pes) > +{ > + dvb_log("MPEG PES"); > + dvb_log(" - sync %#08x", pes->sync); > + dvb_log(" - stream_id %#04x", pes->stream_id); > + dvb_log(" - length %d", pes->length); > + if (pes->stream_id == DVB_MPEG_STREAM_PADDING) { > + } else if (pes->stream_id == DVB_MPEG_STREAM_MAP || > + pes->stream_id == DVB_MPEG_STREAM_PRIVATE_2 || > + pes->stream_id == DVB_MPEG_STREAM_ECM || > + pes->stream_id == DVB_MPEG_STREAM_EMM || > + pes->stream_id == DVB_MPEG_STREAM_DIRECTORY || > + pes->stream_id == DVB_MPEG_STREAM_DSMCC || > + pes->stream_id == DVB_MPEG_STREAM_H222E ) { > + dvb_log(" mpeg pes unsupported stream type %#04x", pes->stream_id); > + } else { > + dvb_log(" mpeg pes optional"); > + dvb_log(" - two %d", pes->optional->two); > + dvb_log(" - PES_scrambling_control %d", pes->optional->PES_scrambling_control); > + dvb_log(" - PES_priority %d", pes->optional->PES_priority); > + dvb_log(" - data_alignment_indicator %d", pes->optional->data_alignment_indicator); > + dvb_log(" - copyright %d", pes->optional->copyright); > + dvb_log(" - original_or_copy %d", pes->optional->original_or_copy); > + dvb_log(" - PTS_DTS %d", pes->optional->PTS_DTS); > + dvb_log(" - ESCR %d", pes->optional->ESCR); > + dvb_log(" - ES_rate %d", pes->optional->ES_rate); > + dvb_log(" - DSM_trick_mode %d", pes->optional->DSM_trick_mode); > + dvb_log(" - additional_copy_info %d", pes->optional->additional_copy_info); > + dvb_log(" - PES_CRC %d", pes->optional->PES_CRC); > + dvb_log(" - PES_extension %d", pes->optional->PES_extension); > + dvb_log(" - length %d", pes->optional->length); > + if (pes->optional->PTS_DTS & 2) > + dvb_log(" - pts %lx (%fs)", pes->optional->pts, (float) pes->optional->pts / 90000.0); > + if (pes->optional->PTS_DTS & 1) > + dvb_log(" - dts %lx (%fs)", pes->optional->dts, (float) pes->optional->dts/ 90000.0); > + } > +} > + > diff --git a/lib/libdvbv5/descriptors/mpeg_ts.c b/lib/libdvbv5/descriptors/mpeg_ts.c > new file mode 100644 > index 0000000..c1d1293 > --- /dev/null > +++ b/lib/libdvbv5/descriptors/mpeg_ts.c > @@ -0,0 +1,77 @@ > +/* > + * Copyright (c) 2012 - Andre Roth <neolynx@gmail.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 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. > + * > + * 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., 51 Franklin Street, Fifth Floor, Boston, MA 02110-1301 USA > + * Or, point your browser to http://www.gnu.org/licenses/old-licenses/gpl-2.0.html > + * > + */ > + > +#include "descriptors/mpeg_ts.h" > +#include "descriptors.h" > +#include "dvb-fe.h" > + > +void dvb_mpeg_ts_init(struct dvb_v5_fe_parms *parms, const uint8_t *buf, ssize_t buflen, uint8_t *table, ssize_t *table_length) > +{ > + if (buf[0] != DVB_MPEG_TS) { Please check buflen before assuming that it contains 1 element. > + dvb_logerr("mpeg ts invalid marker %#02x, sould be %#02x", buf[0], DVB_MPEG_TS); > + *table_length = 0; > + return; > + } > + struct dvb_mpeg_ts *ts = (struct dvb_mpeg_ts *) table; > + const uint8_t *p = buf; Please move data declarations to the beginning. > + memcpy(table, p, sizeof(struct dvb_mpeg_ts)); Please check bufsize. > + p += sizeof(struct dvb_mpeg_ts); > + *table_length = sizeof(struct dvb_mpeg_ts); > + > + bswap16(ts->bitfield); > + > + if (ts->adaptation_field & 0x2) { > + memcpy(table + *table_length, p, sizeof(struct dvb_mpeg_ts_adaption)); > + p += sizeof(struct dvb_mpeg_ts); > + *table_length += ts->adaption->length + 1; > + } > + /*hexdump(parms, "TS: ", buf, buflen);*/ > +} > + > +void dvb_mpeg_ts_free(struct dvb_mpeg_ts *ts) > +{ > + free(ts); > +} > + > +void dvb_mpeg_ts_print(struct dvb_v5_fe_parms *parms, struct dvb_mpeg_ts *ts) > +{ > + dvb_log("MPEG TS"); > + dvb_log(" - sync byte %#02x", ts->sync_byte); > + dvb_log(" - tei %d", ts->tei); > + dvb_log(" - payload_start %d", ts->payload_start); > + dvb_log(" - priority %d", ts->priority); > + dvb_log(" - pid %d", ts->pid); > + dvb_log(" - scrambling %d", ts->scrambling); > + dvb_log(" - adaptation_field %d", ts->adaptation_field); > + dvb_log(" - continuity_counter %d", ts->continuity_counter); > + if (ts->adaptation_field & 0x2) { > + dvb_log(" Adaption Field"); > + dvb_log(" - length %d", ts->adaption->length); > + dvb_log(" - discontinued %d", ts->adaption->discontinued); > + dvb_log(" - random_access %d", ts->adaption->random_access); > + dvb_log(" - priority %d", ts->adaption->priority); > + dvb_log(" - PCR %d", ts->adaption->PCR); > + dvb_log(" - OPCR %d", ts->adaption->OPCR); > + dvb_log(" - splicing_point %d", ts->adaption->splicing_point); > + dvb_log(" - private_data %d", ts->adaption->private_data); > + dvb_log(" - extension %d", ts->adaption->extension); > + } > +} > +
diff --git a/lib/include/descriptors/mpeg_es.h b/lib/include/descriptors/mpeg_es.h new file mode 100644 index 0000000..1a74c90 --- /dev/null +++ b/lib/include/descriptors/mpeg_es.h @@ -0,0 +1,109 @@ +/* + * Copyright (c) 2012 - Andre Roth <neolynx@gmail.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 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. + * + * 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., 51 Franklin Street, Fifth Floor, Boston, MA 02110-1301 USA + * Or, point your browser to http://www.gnu.org/licenses/old-licenses/gpl-2.0.html + * + */ + +#ifndef _MPEG_ES_H +#define _MPEG_ES_H + +#include <stdint.h> +#include <unistd.h> /* ssize_t */ + +#define DVB_MPEG_ES_PIC_START 0x00 +#define DVB_MPEG_ES_USER_DATA 0xb2 +#define DVB_MPEG_ES_SEQ_START 0xb3 +#define DVB_MPEG_ES_SEQ_EXT 0xb5 +#define DVB_MPEG_ES_GOP 0xb8 +#define DVB_MPEG_ES_SLICES 0x01 ... 0xaf + +struct dvb_mpeg_es_seq_start { + union { + uint32_t bitfield; + struct { + uint32_t type:8; + uint32_t sync:24; + } __attribute__((packed)); + } __attribute__((packed)); + union { + uint32_t bitfield2; + struct { + uint32_t framerate:4; + uint32_t aspect:4; + uint32_t height:12; + uint32_t width:12; + } __attribute__((packed)); + }; + union { + uint32_t bitfield3; + struct { + uint32_t qm_nonintra:1; + uint32_t qm_intra:1; + uint32_t constrained:1; + uint32_t vbv:10; // Size of video buffer verifier = 16*1024*vbv buf size + uint32_t one:1; + uint32_t bitrate:18; + } __attribute__((packed)); + }; +} __attribute__((packed)); + +struct dvb_mpeg_es_pic_start { + union { + uint32_t bitfield; + struct { + uint32_t type:8; + uint32_t sync:24; + } __attribute__((packed)); + } __attribute__((packed)); + union { + uint32_t bitfield2; + struct { + uint32_t dummy:3; + uint32_t vbv_delay:16; + uint32_t coding_type:3; + uint32_t temporal_ref:10; + } __attribute__((packed)); + }; +} __attribute__((packed)); + +enum dvb_mpeg_es_frame_t +{ + DVB_MPEG_ES_FRAME_UNKNOWN, + DVB_MPEG_ES_FRAME_I, + DVB_MPEG_ES_FRAME_P, + DVB_MPEG_ES_FRAME_B, + DVB_MPEG_ES_FRAME_D +}; +extern const char *dvb_mpeg_es_frame_names[5]; + +struct dvb_v5_fe_parms; + +#ifdef __cplusplus +extern "C" { +#endif + +int dvb_mpeg_es_seq_start_init (const uint8_t *buf, ssize_t buflen, struct dvb_mpeg_es_seq_start *seq_start); +void dvb_mpeg_es_seq_start_print(struct dvb_v5_fe_parms *parms, struct dvb_mpeg_es_seq_start *seq_start); + +int dvb_mpeg_es_pic_start_init (const uint8_t *buf, ssize_t buflen, struct dvb_mpeg_es_pic_start *pic_start); +void dvb_mpeg_es_pic_start_print(struct dvb_v5_fe_parms *parms, struct dvb_mpeg_es_pic_start *pic_start); + +#ifdef __cplusplus +} +#endif + +#endif diff --git a/lib/include/descriptors/mpeg_pes.h b/lib/include/descriptors/mpeg_pes.h new file mode 100644 index 0000000..e495f44 --- /dev/null +++ b/lib/include/descriptors/mpeg_pes.h @@ -0,0 +1,112 @@ +/* + * Copyright (c) 2011-2012 - Mauro Carvalho Chehab <mchehab@redhat.com> + * Copyright (c) 2012 - Andre Roth <neolynx@gmail.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 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. + * + * 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., 51 Franklin Street, Fifth Floor, Boston, MA 02110-1301 USA + * Or, point your browser to http://www.gnu.org/licenses/old-licenses/gpl-2.0.html + * + */ + +#ifndef _MPEG_PES_H +#define _MPEG_PES_H + +#include <stdint.h> +#include <unistd.h> /* ssize_t */ + +#define DVB_MPEG_PES 0x00001 +#define DVB_MPEG_PES_VIDEO 0xe0 ... 0xef + +#define DVB_MPEG_STREAM_MAP 0xBC +#define DVB_MPEG_STREAM_PADDING 0xBE +#define DVB_MPEG_STREAM_PRIVATE_2 0x5F +#define DVB_MPEG_STREAM_ECM 0x70 +#define DVB_MPEG_STREAM_EMM 0x71 +#define DVB_MPEG_STREAM_DIRECTORY 0xFF +#define DVB_MPEG_STREAM_DSMCC 0x7A +#define DVB_MPEG_STREAM_H222E 0xF8 + +struct ts_t { + uint8_t one:1; + uint8_t bits30:3; + uint8_t tag:4; + + union { + uint16_t bitfield; + struct { + uint16_t one1:1; + uint16_t bits15:15; + } __attribute__((packed)); + } __attribute__((packed)); + + union { + uint16_t bitfield2; + struct { + uint16_t one2:1; + uint16_t bits00:15; + } __attribute__((packed)); + } __attribute__((packed)); +} __attribute__((packed)); + +struct dvb_mpeg_pes_optional { + union { + uint16_t bitfield; + struct { + uint16_t PES_extension:1; + uint16_t PES_CRC:1; + uint16_t additional_copy_info:1; + uint16_t DSM_trick_mode:1; + uint16_t ES_rate:1; + uint16_t ESCR:1; + uint16_t PTS_DTS:2; + uint16_t original_or_copy:1; + uint16_t copyright:1; + uint16_t data_alignment_indicator:1; + uint16_t PES_priority:1; + uint16_t PES_scrambling_control:2; + uint16_t two:2; + } __attribute__((packed)); + } __attribute__((packed)); + uint8_t length; + uint64_t pts; + uint64_t dts; +} __attribute__((packed)); + +struct dvb_mpeg_pes { + union { + uint32_t bitfield; + struct { + uint32_t stream_id:8; + uint32_t sync:24; + } __attribute__((packed)); + } __attribute__((packed)); + uint16_t length; + struct dvb_mpeg_pes_optional optional[]; +} __attribute__((packed)); + +struct dvb_v5_fe_parms; + +#ifdef __cplusplus +extern "C" { +#endif + +void dvb_mpeg_pes_init (struct dvb_v5_fe_parms *parms, const uint8_t *buf, ssize_t buflen, uint8_t *table, ssize_t *table_length); +void dvb_mpeg_pes_free(struct dvb_mpeg_pes *ts); +void dvb_mpeg_pes_print(struct dvb_v5_fe_parms *parms, struct dvb_mpeg_pes *ts); + +#ifdef __cplusplus +} +#endif + +#endif diff --git a/lib/include/descriptors/mpeg_ts.h b/lib/include/descriptors/mpeg_ts.h new file mode 100644 index 0000000..2bb570b --- /dev/null +++ b/lib/include/descriptors/mpeg_ts.h @@ -0,0 +1,79 @@ +/* + * Copyright (c) 2011-2012 - Mauro Carvalho Chehab <mchehab@redhat.com> + * Copyright (c) 2012 - Andre Roth <neolynx@gmail.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 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. + * + * 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., 51 Franklin Street, Fifth Floor, Boston, MA 02110-1301 USA + * Or, point your browser to http://www.gnu.org/licenses/old-licenses/gpl-2.0.html + * + */ + +#ifndef _MPEG_TS_H +#define _MPEG_TS_H + +#include <stdint.h> +#include <unistd.h> /* ssize_t */ + +#define DVB_MPEG_TS 0x47 + +struct dvb_mpeg_ts_adaption { + uint8_t length; + struct { + uint8_t extension:1; + uint8_t private_data:1; + uint8_t splicing_point:1; + uint8_t OPCR:1; + uint8_t PCR:1; + uint8_t priority:1; + uint8_t random_access:1; + uint8_t discontinued:1; + } __attribute__((packed)); + +} __attribute__((packed)); + +struct dvb_mpeg_ts { + uint8_t sync_byte; // DVB_MPEG_TS + union { + uint16_t bitfield; + struct { + uint16_t pid:13; + uint16_t priority:1; + uint16_t payload_start:1; + uint16_t tei:1; + } __attribute__((packed)); + }; + struct { + uint8_t continuity_counter:4; + uint8_t adaptation_field:2; + uint8_t scrambling:2; + } __attribute__((packed)); + struct dvb_mpeg_ts_adaption adaption[]; + +} __attribute__((packed)); + +struct dvb_v5_fe_parms; + +#ifdef __cplusplus +extern "C" { +#endif + +void dvb_mpeg_ts_init (struct dvb_v5_fe_parms *parms, const uint8_t *buf, ssize_t buflen, uint8_t *table, ssize_t *table_length); +void dvb_mpeg_ts_free(struct dvb_mpeg_ts *ts); +void dvb_mpeg_ts_print(struct dvb_v5_fe_parms *parms, struct dvb_mpeg_ts *ts); + +#ifdef __cplusplus +} +#endif + +#endif diff --git a/lib/include/descriptors/nit.h b/lib/include/descriptors/nit.h index f2f6163..d71a762 100644 --- a/lib/include/descriptors/nit.h +++ b/lib/include/descriptors/nit.h @@ -48,7 +48,7 @@ struct dvb_table_nit_transport { struct { uint16_t section_length:12; uint16_t reserved:4; - }; + } __attribute__((packed)); }; struct dvb_desc *descriptor; struct dvb_table_nit_transport *next; @@ -61,7 +61,7 @@ struct dvb_table_nit { struct { uint16_t desc_length:12; uint16_t reserved:4; - }; + } __attribute__((packed)); }; struct dvb_desc *descriptor; struct dvb_table_nit_transport *transport; diff --git a/lib/libdvbv5/Makefile.am b/lib/libdvbv5/Makefile.am index 400af39..795f30c 100644 --- a/lib/libdvbv5/Makefile.am +++ b/lib/libdvbv5/Makefile.am @@ -49,7 +49,10 @@ libdvbv5_la_SOURCES = \ descriptors/sdt.c ../include/descriptors/sdt.h \ descriptors/vct.c ../include/descriptors/vct.h \ descriptors/vct.c ../include/descriptors/vct.h \ - descriptors/desc_service_location.c ../include/descriptors/desc_service_location.h + descriptors/desc_service_location.c ../include/descriptors/desc_service_location.h \ + descriptors/mpeg_ts.c ../include/descriptors/mpeg_ts.h \ + descriptors/mpeg_pes.c ../include/descriptors/mpeg_pes.h \ + descriptors/mpeg_es.c ../include/descriptors/mpeg_es.h libdvbv5_la_CPPFLAGS = $(ENFORCE_LIBDVBV5_STATIC) libdvbv5_la_LDFLAGS = $(LIBDVBV5_VERSION) $(ENFORCE_LIBDVBV5_STATIC) -lm diff --git a/lib/libdvbv5/descriptors/mpeg_es.c b/lib/libdvbv5/descriptors/mpeg_es.c new file mode 100644 index 0000000..b081af4 --- /dev/null +++ b/lib/libdvbv5/descriptors/mpeg_es.c @@ -0,0 +1,76 @@ +/* + * Copyright (c) 2012 - Andre Roth <neolynx@gmail.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 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. + * + * 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., 51 Franklin Street, Fifth Floor, Boston, MA 02110-1301 USA + * Or, point your browser to http://www.gnu.org/licenses/old-licenses/gpl-2.0.html + * + */ + +#include "descriptors/mpeg_es.h" +#include "descriptors.h" +#include "dvb-fe.h" + +int dvb_mpeg_es_seq_start_init(const uint8_t *buf, ssize_t buflen, struct dvb_mpeg_es_seq_start *seq_start) +{ + if(buflen < sizeof(struct dvb_mpeg_es_seq_start)) + return -1; + memcpy(seq_start, buf, sizeof(struct dvb_mpeg_es_seq_start)); + bswap32(seq_start->bitfield); + bswap32(seq_start->bitfield2); + bswap32(seq_start->bitfield3); + return 0; +} + +void dvb_mpeg_es_seq_start_print(struct dvb_v5_fe_parms *parms, struct dvb_mpeg_es_seq_start *seq_start) +{ + dvb_log("MPEG ES SEQ START"); + dvb_log(" - width %d", seq_start->width); + dvb_log(" - height %d", seq_start->height); + dvb_log(" - aspect %d", seq_start->aspect); + dvb_log(" - framerate %d", seq_start->framerate); + dvb_log(" - bitrate %d", seq_start->bitrate); + dvb_log(" - one %d", seq_start->one); + dvb_log(" - vbv %d", seq_start->vbv); + dvb_log(" - constrained %d", seq_start->constrained); + dvb_log(" - qm_intra %d", seq_start->qm_intra); + dvb_log(" - qm_nonintra %d", seq_start->qm_nonintra); +} + +const char *dvb_mpeg_es_frame_names[5] = { + "?", + "I", + "P", + "B", + "D" +}; + +int dvb_mpeg_es_pic_start_init(const uint8_t *buf, ssize_t buflen, struct dvb_mpeg_es_pic_start *pic_start) +{ + if(buflen < sizeof(struct dvb_mpeg_es_pic_start)) + return -1; + memcpy(pic_start, buf, sizeof(struct dvb_mpeg_es_pic_start)); + bswap32(pic_start->bitfield); + bswap32(pic_start->bitfield2); + return 0; +} + +void dvb_mpeg_es_pic_start_print(struct dvb_v5_fe_parms *parms, struct dvb_mpeg_es_pic_start *pic_start) +{ + dvb_log("MPEG ES PIC START"); + dvb_log(" - temporal_ref %d", pic_start->temporal_ref); + dvb_log(" - coding_type %d (%s-frame)", pic_start->coding_type, dvb_mpeg_es_frame_names[pic_start->coding_type]); + dvb_log(" - vbv_delay %d", pic_start->vbv_delay); +} + diff --git a/lib/libdvbv5/descriptors/mpeg_pes.c b/lib/libdvbv5/descriptors/mpeg_pes.c new file mode 100644 index 0000000..c717297 --- /dev/null +++ b/lib/libdvbv5/descriptors/mpeg_pes.c @@ -0,0 +1,131 @@ +/* + * Copyright (c) 2012 - Andre Roth <neolynx@gmail.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 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. + * + * 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., 51 Franklin Street, Fifth Floor, Boston, MA 02110-1301 USA + * Or, point your browser to http://www.gnu.org/licenses/old-licenses/gpl-2.0.html + * + */ + +#include "descriptors/mpeg_pes.h" +#include "descriptors.h" +#include "dvb-fe.h" + +void dvb_mpeg_pes_init(struct dvb_v5_fe_parms *parms, const uint8_t *buf, ssize_t buflen, uint8_t *table, ssize_t *table_length) +{ + struct dvb_mpeg_pes *pes = (struct dvb_mpeg_pes *) (table + *table_length); + const uint8_t *p = buf; + memcpy(table + *table_length, p, sizeof(struct dvb_mpeg_pes)); + p += sizeof(struct dvb_mpeg_pes); + *table_length += sizeof(struct dvb_mpeg_pes); + + bswap32(pes->bitfield); + bswap16(pes->length); + + if (pes->sync != 0x000001 ) { + dvb_logerr("mpeg pes invalid"); + return; + } + + if (pes->stream_id == DVB_MPEG_STREAM_PADDING) { + dvb_logwarn("mpeg pes padding stream ignored"); + } else if (pes->stream_id == DVB_MPEG_STREAM_MAP || + pes->stream_id == DVB_MPEG_STREAM_PRIVATE_2 || + pes->stream_id == DVB_MPEG_STREAM_ECM || + pes->stream_id == DVB_MPEG_STREAM_EMM || + pes->stream_id == DVB_MPEG_STREAM_DIRECTORY || + pes->stream_id == DVB_MPEG_STREAM_DSMCC || + pes->stream_id == DVB_MPEG_STREAM_H222E ) { + dvb_logerr("mpeg pes: unsupported stream type %#04x", pes->stream_id); + } else { + memcpy(pes->optional, p, sizeof(struct dvb_mpeg_pes_optional) - + sizeof(pes->optional->pts) - + sizeof(pes->optional->dts)); + p += sizeof(struct dvb_mpeg_pes_optional) - + sizeof(pes->optional->pts) - + sizeof(pes->optional->dts); + bswap16(pes->optional->bitfield); + pes->optional->pts = 0; + pes->optional->dts = 0; + if (pes->optional->PTS_DTS & 2) { + struct ts_t pts; + memcpy(&pts, p, sizeof(pts)); + p += sizeof(pts); + bswap16(pts.bitfield); + bswap16(pts.bitfield2); + if (pts.one != 1 || pts.one1 != 1 || pts.one2 != 1) + dvb_logwarn("mpeg pes: invalid pts"); + else { + pes->optional->pts |= (uint64_t) pts.bits00; + pes->optional->pts |= (uint64_t) pts.bits15 << 15; + pes->optional->pts |= (uint64_t) pts.bits30 << 30; + } + } + if (pes->optional->PTS_DTS & 1) { + struct ts_t dts; + memcpy(&dts, p, sizeof(dts)); + p += sizeof(dts); + bswap16(dts.bitfield); + bswap16(dts.bitfield2); + pes->optional->dts |= (uint64_t) dts.bits00; + pes->optional->dts |= (uint64_t) dts.bits15 << 15; + pes->optional->dts |= (uint64_t) dts.bits30 << 30; + } + *table_length += sizeof(struct dvb_mpeg_pes_optional); + } +} + +void dvb_mpeg_pes_free(struct dvb_mpeg_pes *ts) +{ + free(ts); +} + +void dvb_mpeg_pes_print(struct dvb_v5_fe_parms *parms, struct dvb_mpeg_pes *pes) +{ + dvb_log("MPEG PES"); + dvb_log(" - sync %#08x", pes->sync); + dvb_log(" - stream_id %#04x", pes->stream_id); + dvb_log(" - length %d", pes->length); + if (pes->stream_id == DVB_MPEG_STREAM_PADDING) { + } else if (pes->stream_id == DVB_MPEG_STREAM_MAP || + pes->stream_id == DVB_MPEG_STREAM_PRIVATE_2 || + pes->stream_id == DVB_MPEG_STREAM_ECM || + pes->stream_id == DVB_MPEG_STREAM_EMM || + pes->stream_id == DVB_MPEG_STREAM_DIRECTORY || + pes->stream_id == DVB_MPEG_STREAM_DSMCC || + pes->stream_id == DVB_MPEG_STREAM_H222E ) { + dvb_log(" mpeg pes unsupported stream type %#04x", pes->stream_id); + } else { + dvb_log(" mpeg pes optional"); + dvb_log(" - two %d", pes->optional->two); + dvb_log(" - PES_scrambling_control %d", pes->optional->PES_scrambling_control); + dvb_log(" - PES_priority %d", pes->optional->PES_priority); + dvb_log(" - data_alignment_indicator %d", pes->optional->data_alignment_indicator); + dvb_log(" - copyright %d", pes->optional->copyright); + dvb_log(" - original_or_copy %d", pes->optional->original_or_copy); + dvb_log(" - PTS_DTS %d", pes->optional->PTS_DTS); + dvb_log(" - ESCR %d", pes->optional->ESCR); + dvb_log(" - ES_rate %d", pes->optional->ES_rate); + dvb_log(" - DSM_trick_mode %d", pes->optional->DSM_trick_mode); + dvb_log(" - additional_copy_info %d", pes->optional->additional_copy_info); + dvb_log(" - PES_CRC %d", pes->optional->PES_CRC); + dvb_log(" - PES_extension %d", pes->optional->PES_extension); + dvb_log(" - length %d", pes->optional->length); + if (pes->optional->PTS_DTS & 2) + dvb_log(" - pts %lx (%fs)", pes->optional->pts, (float) pes->optional->pts / 90000.0); + if (pes->optional->PTS_DTS & 1) + dvb_log(" - dts %lx (%fs)", pes->optional->dts, (float) pes->optional->dts/ 90000.0); + } +} + diff --git a/lib/libdvbv5/descriptors/mpeg_ts.c b/lib/libdvbv5/descriptors/mpeg_ts.c new file mode 100644 index 0000000..c1d1293 --- /dev/null +++ b/lib/libdvbv5/descriptors/mpeg_ts.c @@ -0,0 +1,77 @@ +/* + * Copyright (c) 2012 - Andre Roth <neolynx@gmail.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 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. + * + * 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., 51 Franklin Street, Fifth Floor, Boston, MA 02110-1301 USA + * Or, point your browser to http://www.gnu.org/licenses/old-licenses/gpl-2.0.html + * + */ + +#include "descriptors/mpeg_ts.h" +#include "descriptors.h" +#include "dvb-fe.h" + +void dvb_mpeg_ts_init(struct dvb_v5_fe_parms *parms, const uint8_t *buf, ssize_t buflen, uint8_t *table, ssize_t *table_length) +{ + if (buf[0] != DVB_MPEG_TS) { + dvb_logerr("mpeg ts invalid marker %#02x, sould be %#02x", buf[0], DVB_MPEG_TS); + *table_length = 0; + return; + } + struct dvb_mpeg_ts *ts = (struct dvb_mpeg_ts *) table; + const uint8_t *p = buf; + memcpy(table, p, sizeof(struct dvb_mpeg_ts)); + p += sizeof(struct dvb_mpeg_ts); + *table_length = sizeof(struct dvb_mpeg_ts); + + bswap16(ts->bitfield); + + if (ts->adaptation_field & 0x2) { + memcpy(table + *table_length, p, sizeof(struct dvb_mpeg_ts_adaption)); + p += sizeof(struct dvb_mpeg_ts); + *table_length += ts->adaption->length + 1; + } + /*hexdump(parms, "TS: ", buf, buflen);*/ +} + +void dvb_mpeg_ts_free(struct dvb_mpeg_ts *ts) +{ + free(ts); +} + +void dvb_mpeg_ts_print(struct dvb_v5_fe_parms *parms, struct dvb_mpeg_ts *ts) +{ + dvb_log("MPEG TS"); + dvb_log(" - sync byte %#02x", ts->sync_byte); + dvb_log(" - tei %d", ts->tei); + dvb_log(" - payload_start %d", ts->payload_start); + dvb_log(" - priority %d", ts->priority); + dvb_log(" - pid %d", ts->pid); + dvb_log(" - scrambling %d", ts->scrambling); + dvb_log(" - adaptation_field %d", ts->adaptation_field); + dvb_log(" - continuity_counter %d", ts->continuity_counter); + if (ts->adaptation_field & 0x2) { + dvb_log(" Adaption Field"); + dvb_log(" - length %d", ts->adaption->length); + dvb_log(" - discontinued %d", ts->adaption->discontinued); + dvb_log(" - random_access %d", ts->adaption->random_access); + dvb_log(" - priority %d", ts->adaption->priority); + dvb_log(" - PCR %d", ts->adaption->PCR); + dvb_log(" - OPCR %d", ts->adaption->OPCR); + dvb_log(" - splicing_point %d", ts->adaption->splicing_point); + dvb_log(" - private_data %d", ts->adaption->private_data); + dvb_log(" - extension %d", ts->adaption->extension); + } +} +
Signed-off-by: André Roth <neolynx@gmail.com> --- lib/include/descriptors/mpeg_es.h | 109 ++++++++++++++++++++++++++++++ lib/include/descriptors/mpeg_pes.h | 112 ++++++++++++++++++++++++++++++ lib/include/descriptors/mpeg_ts.h | 79 ++++++++++++++++++++++ lib/include/descriptors/nit.h | 4 +- lib/libdvbv5/Makefile.am | 5 +- lib/libdvbv5/descriptors/mpeg_es.c | 76 +++++++++++++++++++++ lib/libdvbv5/descriptors/mpeg_pes.c | 131 ++++++++++++++++++++++++++++++++++++ lib/libdvbv5/descriptors/mpeg_ts.c | 77 +++++++++++++++++++++ 8 files changed, 590 insertions(+), 3 deletions(-) create mode 100644 lib/include/descriptors/mpeg_es.h create mode 100644 lib/include/descriptors/mpeg_pes.h create mode 100644 lib/include/descriptors/mpeg_ts.h create mode 100644 lib/libdvbv5/descriptors/mpeg_es.c create mode 100644 lib/libdvbv5/descriptors/mpeg_pes.c create mode 100644 lib/libdvbv5/descriptors/mpeg_ts.c