/* * linuxdvb output/writer handling. * * konfetti 2010 based on linuxdvb.c code from libeplayer2 * * 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 * */ #include #include #include #include #include #include #include #include "misc.h" #include "pes.h" #include "writer.h" class WriterMPEG2 : public Writer { public: bool Write(int fd, AVFormatContext *avfc, AVStream *stream, AVPacket *packet, int64_t &pts); WriterMPEG2(); }; bool WriterMPEG2::Write(int fd, AVFormatContext * /* avfc */, AVStream * /* stream */, AVPacket *packet, int64_t &pts) { if (fd < 0 || !packet) return false; unsigned char PesHeader[PES_MAX_HEADER_SIZE]; int64_t _pts = pts; for (int Position = 0; Position < packet->size; ) { int PacketLength = std::min(packet->size - Position, MAX_PES_PACKET_SIZE); struct iovec iov[2]; iov[0].iov_base = PesHeader; iov[0].iov_len = InsertPesHeader(PesHeader, PacketLength, 0xe0, _pts, 0); iov[1].iov_base = packet->data + Position; iov[1].iov_len = PacketLength; ssize_t l = writev(fd, iov, 2); if (l < 0) { return false; break; } Position += PacketLength; _pts = INVALID_PTS_VALUE; } return true; } WriterMPEG2::WriterMPEG2() { Register(this, AV_CODEC_ID_MPEG2TS, VIDEO_ENCODING_AUTO); } static WriterMPEG2 writer_mpeg2 __attribute__ ((init_priority (300)));