Go to the documentation of this file.
14 for (
int i=0; i<mx->
extcnt;i++) {
19 if (aavail+vavail)
return ((aavail+vavail));
25 for (
int i=0; i < n; i++)
35 for (
int i=0; i < n; i++) {
41 }
else if(
ptscmp(tmppts, ext[i].
pts) > 0) {
56 LOG(VB_GENERAL, LOG_ERR,
57 "error in peek next video unit");
64 LOG(VB_GENERAL, LOG_DEBUG,
65 QString(
"video index start: %1 stop: %2 (%3) rpos: %4\n")
66 .arg(viu->start).arg(viu->start+viu->length)
80 LOG(VB_GENERAL, LOG_ERR,
81 "error in get next video unit");
88 LOG(VB_GENERAL, LOG_INFO,
89 QString(
"video index start: %1 stop: %2 (%3) rpos: %4\n")
90 .arg(viu->start).arg(viu->start+viu->length)
96 viu->ptsrate = (
uptsdiff(nviu.dts, viu->dts) << 8) / viu->length;
106 LOG(VB_GENERAL, LOG_ERR,
107 "error in peek next video unit");
115 LOG(VB_GENERAL, LOG_DEBUG,
116 QString(
"ext index start: %1 stop: %2 (%3) rpos: %4")
117 .arg(extiu->start).arg(extiu->start+extiu->length)
130 for(j = 0; j < mx->
ext[i].frmperpkt; j++) {
136 LOG(VB_GENERAL, LOG_ERR,
137 "error in get next ext unit");
144 length += piu->length;
157 LOG(VB_GENERAL, LOG_DEBUG,
158 QString(
"ext index start: %1 stop: %2 (%3) rpos: %4")
186 std::array<uint8_t,3000> outbuf {};
193 LOG(VB_GENERAL, LOG_DEBUG,
"writing VIDEO pack");
209 mx->
SCR, mx->
muxr, outbuf.data());
214 LOG(VB_GENERAL, LOG_DEBUG,
" with sequence and gop header");
221 unsigned int length = viu->
length;
222 while (!mx->
is_ts && length < mx->data_size){
225 int old_frame = viu->
frame;
226 uint64_t old_pts = viu->
pts;
227 uint64_t old_dts = viu->
dts;
231 if (!nviu.seq_header || !nviu.gop ||
239 viu->
frame = old_frame;
250 std::vector<uint8_t> gop(8);
251 frame_len=length-frame_len;
261 LOG(VB_GENERAL, LOG_DEBUG,
262 QString(
"EXTRACLOCK2: %1 %2 %3")
264 LOG(VB_GENERAL, LOG_DEBUG, QString(
"EXTRACLOCK2: %1")
275 int nlength = length;
279 mx->
SCR, outbuf.data(), &nlength,
285 mx->
SCR, mx->
muxr, outbuf.data(), &nlength,
301 if (
write(mx->
fd_out, outbuf.data(), written) != written) {
304 if (mx->
error < 10) {
305 LOG(VB_GENERAL, LOG_ERR,
306 QString(
"%1 writes failed: %2")
307 .arg(mx->
error).arg(strerror(errno)));
312 LOG(VB_GENERAL, LOG_DEBUG,
"VPTS");
314 LOG(VB_GENERAL, LOG_DEBUG,
" DTS");
327 std::array<uint8_t,3000> outbuf {};
338 uint64_t adelay = mx->
ext[n].pts_off;
339 uint64_t *apts = &mx->
ext[n].pts;
346 LOG(VB_GENERAL, LOG_DEBUG, QString(
"writing AUDIO%1 pack\n").arg(n));
352 LOG(VB_GENERAL, LOG_DEBUG, QString(
"writing AC3%1 pack\n").arg(n));
367 unsigned int length = aiu->
length;
368 if (length < aiu->framesize){
375 LOG(VB_GENERAL, LOG_DEBUG, QString(
"start: %1 stop: %2 (%3) length %4")
377 .arg(aiu->
length).arg(length));
384 while (!mx->
is_ts && length < mx->data_size + rest_data){
393 length+= aiu->length;
394 if (length < mx->data_size + rest_data)
400 LOG(VB_GENERAL, LOG_DEBUG,
401 QString(
"start: %1 stop: %2 (%3) length %4")
402 .arg(aiu->start).arg(aiu->start+aiu->length)
403 .arg(aiu->length).arg(length));
412 LOG(VB_GENERAL, LOG_ERR,
"error in writeout ext");
417 int nlength = length;
423 outbuf.data(), &nlength, newpts ? 0 :
PTS_ONLY,
435 outbuf.data(), &nlength, newpts ? 0 :
PTS_ONLY,
467 if ((int64_t)*apts < 0)
468 LOG(VB_GENERAL, LOG_DEBUG,
"SCHEISS APTS");
476 LOG(VB_GENERAL, LOG_ERR,
"error in writeout ext");
483 std::array<uint8_t,3000> outbuf {};
485 LOG(VB_GENERAL, LOG_INFO,
"writing PADDING pack");
489 mx->
muxr, outbuf.data());
501 LOG(VB_GENERAL, LOG_ERR,
"error in get next video unit");
513 LOG(VB_GENERAL, LOG_DEBUG,
529 for (
int i=0; i<mx->
extcnt; i++){
531 mx->
ext[i].iu.pts) > 0) {
534 mx->
ext[i].iu.pts) > 0)
540 if (temp_scr > 0.0) {
551 for (
int i=0;i <mx->
extcnt; i++)
561 for (
int i = 0; i < mx->
extcnt; i++){
563 mx->
ext[i].iu.length > 0 &&
572 LOG(VB_GENERAL, LOG_DEBUG,
"SCR");
574 LOG(VB_GENERAL, LOG_DEBUG,
"VDTS");
576 LOG(VB_GENERAL, LOG_DEBUG, QString(
" (%1) EXT").arg(*video_ok));
577 for (
int i = 0; i < mx->
extcnt; i++){
578 LOG(VB_GENERAL, LOG_DEBUG,
579 QString(
"%1:").arg(mx->
ext[i].type));
581 LOG(VB_GENERAL, LOG_DEBUG,
582 QString(
" (%1)").arg(ext_ok[i]));
602 if (!done && !mx->
VBR){
615 std::array<uint8_t,4> mpeg_end { 0x00, 0x00, 0x01, 0xB9 };
641 for (
int i = 0; i < mx->
extcnt; i++){
657 LOG(VB_GENERAL, LOG_ERR,
658 QString(
"close failed: %1")
659 .arg(strerror(errno)));
663 for (
int i=0; i<mx->
extcnt;i++)
672 uint32_t numpkt = (framesize +
PES_H_MIN + 10 + pktdata -1) / pktdata;
673 return pktsize- ((pktsize * numpkt) - framesize + numpkt - 1) / numpkt;
681 for (
int i = 0; i < cnt; i++) {
688 int numpkt = (size + pktdata - 1) / pktdata;
689 int overhead = (pktsize * numpkt - size + numpkt - 1) / numpkt;
693 return pktsize - max;
698 uint64_t video_delay, uint64_t audio_delay,
int fd,
705 uint32_t data_rate = 0;
798 for (mx->
extcnt = 0, data_rate = 0, i = 0;
799 i <
N_AUDIO && exttype[i]; i++){
801 LOG(VB_GENERAL, LOG_ERR,
802 QString(
"Found illegal stream type %1").arg(exttype[i]));
805 mx->
ext[i].type = exttype[i];
806 mx->
ext[i].pts_off = 0;
807 mx->
ext[i].frmperpkt = 1;
808 mx->
ext[i].strmnum = exttypcnt[i];
809 strncpy(mx->
ext[i].language, extframe[i].
language, 4);
837 data_rate += seq_head->
bit_rate *400;
844 LOG(VB_GENERAL, LOG_WARNING,
845 "data rate may be to high for required mux rate");
848 LOG(VB_GENERAL, LOG_INFO, QString(
"Mux rate: %1 Mbit/s")
849 .arg(mx->
muxr*8.0/1000000.0, 0,
'f',2,QChar(
'0')));
851 mx->
SCRinc = 27000000ULL/((uint64_t)mx->
muxr /
859 for (
int i=0; i < mx->
extcnt; i++)
868 mx->
ext[i].iu.pts, mx->
ext[i].pts_off);
876 std::array<uint8_t,2048> outbuf {};
882 std::array<uint8_t,2048> outbuf {};
884 mx->
SCR, mx->
muxr, outbuf.data());
void pts2time(uint64_t pts, uint8_t *buf, int len)
static int get_ts_video_overhead(int pktsize, sequence_t *seq)
static int get_next_ext_unit(multiplex_t *mx, index_unit *extiu, int i)
int write_out_packs(multiplex_t *mx, int video_ok, aok_arr &ext_ok)
void start(QThread::Priority p=QThread::InheritPriority)
Tell MThread to start running the thread in the near future.
static int peek_next_video_unit(multiplex_t *mx, index_unit *viu)
int dummy_init(dummy_buffer *dbuf, int s)
static uint8_t get_ptsdts(multiplex_t *mx, index_unit *viu)
static int fill_buffers(void *r, int finish)
int ring_peek(ringbuffer *rbuf, uint8_t *data, unsigned int count, uint32_t off)
int dummy_delete(dummy_buffer *dbuf, uint64_t time)
uint32_t audio_buffer_size
static void writeout_video(multiplex_t *mx)
def write(text, progress=True)
void write_ts_patpmt(extdata_t *ext, int extcnt, uint8_t prog_num, uint8_t *buf)
int write_video_pes(int pack_size, int extcnt, uint64_t vpts, uint64_t vdts, uint64_t SCR, uint64_t muxr, uint8_t *buf, int *vlength, uint8_t ptsdts, ringbuffer *vrbuffer)
static void ptsinc(uint64_t *pts1, uint64_t pts2)
void printpts(int64_t pts)
#define LOG(_MASK_, _LEVEL_, _QSTRING_)
void init_multiplex(multiplex_t *mx, sequence_t *seq_head, audio_frame_t *extframe, int *exttype, const int *exttypcnt, uint64_t video_delay, uint64_t audio_delay, int fd, int(*fill_buffers)(void *p, int f), ringbuffer *vrbuffer, ringbuffer *index_vrbuffer, ringbuffer *extrbuffer, ringbuffer *index_extrbuffer, int otype)
std::array< extdata_t, N_AUDIO > ext_arr
int64_t ptsdiff(uint64_t pts1, uint64_t pts2)
static void writeout_ext(multiplex_t *mx, int n)
int write_ac3_pes(int pack_size, int extcnt, int n, uint64_t pts, uint64_t SCR, uint32_t muxr, uint8_t *buf, int *alength, uint8_t ptsdts, int nframes, int ac3_off, ringbuffer *ac3rbuffer)
ringbuffer * index_extrbuffer
static int peek_next_ext_unit(multiplex_t *mx, index_unit *extiu, int i)
void dummy_destroy(dummy_buffer *dbuf)
ringbuffer * index_vrbuffer
int dummy_add(dummy_buffer *dbuf, uint64_t time, uint32_t size)
void check_times(multiplex_t *mx, int *video_ok, aok_arr &ext_ok, int *start)
static int get_next_video_unit(multiplex_t *mx, index_unit *viu)
int finish_mpg(multiplex_t *mx)
static int which_ext(ext_arr &ext, const aok_arr &aok, int n)
static int ring_rpos(ringbuffer *rbuf)
static void writeout_padding(multiplex_t *mx)
uint64_t uptsdiff(uint64_t pts1, uint64_t pts2)
int ring_read(ringbuffer *rbuf, uint8_t *data, int count)
void write_padding_pes(int pack_size, int extcnt, uint64_t SCR, uint64_t muxr, uint8_t *buf)
int write_nav_pack(int pack_size, int extcnt, uint64_t SCR, uint32_t muxr, uint8_t *buf)
static int use_video(uint64_t vpts, ext_arr &ext, const aok_arr &aok, int n)
static unsigned int ring_avail(ringbuffer *rbuf)
int(* fill_buffers)(void *p, int f)
int write_audio_ts(int n, uint64_t pts, uint8_t *buf, int *alength, uint8_t ptsdts, ringbuffer *arbuffer)
void exit(int retcode=0)
Use this to exit from the thread if you are using a Qt event loop.
static uint32_t dummy_space(dummy_buffer *dbuf)
std::chrono::duration< CHRONO_TYPE, std::ratio< 1, 90000 > > pts
static int get_ts_ext_overhead(int pktsize, audio_frame_t *extframe, extdata_t *ext, int cnt)
void setup_multiplex(multiplex_t *mx)
uint32_t video_buffer_size
int write_audio_pes(int pack_size, int extcnt, int n, uint64_t pts, uint64_t SCR, uint32_t muxr, uint8_t *buf, int *alength, uint8_t ptsdts, ringbuffer *arbuffer)
int ptscmp(uint64_t pts1, uint64_t pts2)
int ring_poke(ringbuffer *rbuf, uint8_t *data, unsigned int count, uint32_t off)
static const iso6937table * d
int write_video_ts(uint64_t vpts, uint64_t vdts, uint64_t SCR, uint8_t *buf, int *vlength, uint8_t ptsdts, ringbuffer *vrbuffer)
int write_ac3_ts(int n, uint64_t pts, uint8_t *buf, int *alength, uint8_t ptsdts, int nframes, ringbuffer *ac3rbuffer)
static int buffers_filled(multiplex_t *mx)
std::array< bool, N_AUDIO > aok_arr