2 Copyright 2005-2008 Mark Calderbank
3 Copyright 2007 Marten Richter (AC3 support)
5 This file is part of VOMP.
7 VOMP is free software; you can redistribute it and/or modify
8 it under the terms of the GNU General Public License as published by
9 the Free Software Foundation; either version 2 of the License, or
10 (at your option) any later version.
12 VOMP is distributed in the hope that it will be useful,
13 but WITHOUT ANY WARRANTY; without even the implied warranty of
14 MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the
15 GNU General Public License for more details.
17 You should have received a copy of the GNU General Public License
18 along with VOMP; if not, write to the Free Software Foundation, Inc.,
19 51 Franklin Street, Fifth Floor, Boston, MA 02110-1301, USA.
25 #include "dvbsubtitles.h"
32 #define DEMUXER_SEQ_HEAD 0x000001B3
33 #define DEMUXER_PIC_HEAD 0x00000101
35 #define DEMUXER_H264_ACCESS_UNIT 0x00000109
36 #define DEMUXER_H264_SEQ_PARAMETER_SET 0x00000107
39 #define SEEK_THRESHOLD 150000 // About 1.5 seconds
42 const int Demuxer::FrameRates[9] = { 0, 23, 24, 25, 29, 30, 50, 59, 60 };
43 Demuxer* Demuxer::instance = NULL;
47 NALUUnit(const UCHAR* buf,UINT length_buf);
50 inline UINT getBits(UINT num_bits);
53 bool isEonalu() {return eonalu;};
65 NALUUnit::NALUUnit(const UCHAR *buf, UINT length_buf)
77 UINT pattern =(((UINT)buf[ 0] << 16) |
81 while (pattern != 0x000001)
83 if (++nalu_start >= length_buf) return;
84 pattern = ((pattern << 8) | buf[nalu_start])&0x00FFFFFF;
86 nalu_end=nalu_start+1;
87 pattern = ((pattern << 8) | buf[nalu_end])&0x00FFFFFF;
89 while (pattern != 0x000001 && pattern != 0x000000)
91 if (++nalu_end >= length_buf) { nalu_end+=3;break;};
92 pattern = ((pattern << 8) | buf[nalu_end])&0x00FFFFFF;
95 nalu_end=min(length_buf-1,nalu_end);
96 nalu_length=nalu_end-nalu_start;
97 nalu_buf=(UCHAR*)malloc(nalu_length);
98 memcpy(nalu_buf,buf+nalu_start,nalu_length);
102 NALUUnit::~NALUUnit()
104 if (nalu_buf) free(nalu_buf);
107 inline UINT NALUUnit::getBits(UINT num_bits)
109 if (num_bits==0) return 0; //???
110 UINT remain_bits=num_bits;
112 //May be slow, but should work!
113 while (remain_bits>0) {
117 last_bytes=(last_bytes<<8) & nalu_buf[pos];
118 if ((last_bytes & 0x00FFFFFF) == 0x000003) pos++; //emulation prevention byte
121 working_byte=nalu_buf[pos];
137 UINT fetch_bits=min(remain_bits,8-bit_pos);
138 work=work <<fetch_bits;
139 //work|=((working_byte>>bit_pos) & (0xFF>>(8-fetch_bits)));
140 work|=(working_byte &(0xFF>>(bit_pos)))>>(8-fetch_bits-bit_pos);
141 remain_bits-=fetch_bits;
142 bit_pos=(bit_pos+fetch_bits)%8;
147 UINT NALUUnit::getUe()
151 for( bit = 0; !bit && !eonalu; leadbits++ )
153 if (eonalu) return true;
154 return ((1 << leadbits)-1)+getBits(leadbits);
157 int NALUUnit::getSe()
160 if (input==0) return 0;
161 int output=((input+1)>>1);
162 if (input & 0x1) output*=-1;
168 static const int PESPacket_initial_size = 2000;
171 PESPacket::PESPacket()
173 data_size = PESPacket_initial_size;
174 data = (UCHAR*)malloc(data_size);
181 PESPacket::PESPacket(const PESPacket& packet)
186 PESPacket& PESPacket::operator=(const PESPacket& packet)
190 if (data) free(data);
196 PESPacket::~PESPacket()
198 if (data) free(data);
201 void PESPacket::copyFrom(const PESPacket& packet)
203 length = packet.length;
205 packetType = packet.packetType;
206 substream = packet.substream;
207 seq_header = packet.seq_header;
209 data = (UCHAR*)malloc(data_size);
210 memcpy(data, packet.data, data_size);
213 void PESPacket::init(UCHAR type, UCHAR sub)
217 data[4] = data[5] = 0;
221 seq_header = 1; // Unknown seq_header status
224 void PESPacket::truncate()
226 init(packetType,substream);
229 int PESPacket::write(const UCHAR *buf, int len)
231 if (size + len > 0x10000) return 0;
232 if (size + len > data_size)
234 UINT new_data_size = max(data_size + data_size / 2, data_size + len);
235 if (new_data_size > 0x10000) new_data_size = 0x10000;
236 data_size = new_data_size;
237 data = (UCHAR*)realloc(data, data_size);
239 memcpy(data + size, buf, len);
242 data[4] = (length >> 8);
243 data[5] = (length & 0xFF);
244 // We have added data - reset seq_header indicator if necessary
245 if (seq_header == 0) seq_header = 1; // Reset to 'unknown'
249 ULLONG PESPacket::getPTS() const
251 if ( ( (packetType >= Demuxer::PESTYPE_AUD0 &&
252 packetType <= Demuxer::PESTYPE_AUDMAX)
254 (packetType >= Demuxer::PESTYPE_VID0 &&
255 packetType <= Demuxer::PESTYPE_VIDMAX)
257 packetType == Demuxer::PESTYPE_PRIVATE_1
259 && size >= 14 && data[7] & 0x80)
261 return ( (ULLONG)(data[ 9] & 0x0E) << 29) |
262 ( (ULLONG)(data[10]) << 22 ) |
263 ( (ULLONG)(data[11] & 0xFE) << 14 ) |
264 ( (ULLONG)(data[12]) << 7 ) |
265 ( (ULLONG)(data[13] & 0xFE) >> 1 );
267 else return PTS_INVALID;
270 UCHAR PESPacket::operator[] (UINT index) const
278 UINT PESPacket::findPictureHeader(bool h264) const
280 if (size < 12) return 0;
281 UINT pattern = ( ((UINT)data[ 8] << 24) |
282 ((UINT)data[ 9] << 16) |
283 ((UINT)data[10] << 8) |
288 while (pattern != DEMUXER_H264_ACCESS_UNIT)
290 if (++pos >= size) return 0;
291 pattern = (pattern << 8) | data[pos];
295 while (pattern != DEMUXER_PIC_HEAD)
297 if (++pos >= size) return 0;
298 pattern = (pattern << 8) | data[pos];
304 UINT PESPacket::findSeqHeader(bool h264) const
306 if (seq_header != 1) return seq_header;
307 if (size < 12) return 0;
308 UINT pattern = ( ((UINT)data[ 8] << 24) |
309 ((UINT)data[ 9] << 16) |
310 ((UINT)data[10] << 8) |
314 while ((pattern & 0xFFFFFF1F) != DEMUXER_H264_SEQ_PARAMETER_SET)
321 pattern = (pattern << 8) | data[pos];
323 seq_header = pos - 3;
327 while (pattern != DEMUXER_SEQ_HEAD)
334 pattern = (pattern << 8) | data[pos];
336 seq_header = pos - 3;
344 if (instance) return;
349 vid_seeking = aud_seeking = false;
350 video_pts = audio_pts = 0;
351 ispre_1_3_19 = false;
363 Demuxer* Demuxer::getInstance()
368 int Demuxer::init(Callback* tcallback, DrainTarget* audio, DrainTarget* video, DrainTarget* teletext,
369 ULONG demuxMemoryV, ULONG demuxMemoryA, ULONG demuxMemoryT,double infps, DVBSubtitles* tsubtitles)
373 if ( !videostream.init(video, demuxMemoryV) ||
374 !audiostream.init(audio, demuxMemoryA) ||
375 !teletextstream.init(teletext, demuxMemoryT))
377 Log::getInstance()->log("Demuxer", Log::CRIT,
378 "Failed to initialize demuxer");
384 isteletextdecoded = true;
386 isteletextdecoded = false;
391 subtitles = tsubtitles;
392 callback = tcallback;
396 void Demuxer::reset()
398 Log::getInstance()->log("Demuxer", Log::DEBUG, "Reset called");
400 video_current = audio_current = teletext_current = subtitle_current = -1;
401 horizontal_size = vertical_size = 0;
402 aspect_ratio = (enum AspectRatio) 0;
403 frame_rate = bit_rate = 0;
404 ispre_1_3_19 = false;
408 for (int i = 0; i <= (PESTYPE_AUDMAX - PESTYPE_AUD0); i++)
410 avail_mpaudchan[i] = false;
412 for (int i = 0; i <= (PESTYPE_SUBSTREAM_AC3MAX - PESTYPE_SUBSTREAM_AC30); i++)
414 avail_ac3audchan[i] = false;
416 for (int i = 0; i <= (PESTYPE_SUBSTREAM_DVBSUBTITLEMAX - PESTYPE_SUBSTREAM_DVBSUBTITLE0); i++)
418 avail_dvbsubtitlechan[i] = false;
422 int Demuxer::shutdown()
424 videostream.shutdown();
425 audiostream.shutdown();
426 teletextstream.shutdown();
431 void Demuxer::flush()
433 Log::getInstance()->log("Demuxer", Log::DEBUG, "Flush called");
437 teletextstream.flush();
440 void Demuxer::flushAudio()
447 vid_seeking = aud_seeking = true;
448 video_pts = audio_pts = teletext_pts = 0;
451 void Demuxer::setAudioStream(int id)
456 void Demuxer::setVideoStream(int id)
461 void Demuxer::setTeletextStream(int id)
463 teletext_current = id;
466 void Demuxer::setDVBSubtitleStream(int id)
468 subtitle_current = id;
471 void Demuxer::setAspectRatio(enum AspectRatio ar)
473 if (aspect_ratio != ar)
475 Log::getInstance()->log("Demux", Log::DEBUG,
476 "Aspect ratio difference signalled");
477 if (++arcnt > 3) // avoid changing aspect ratio if glitch in signal
481 if (callback) callback->call(this);
488 bool Demuxer::writeAudio()
490 return audiostream.drain();
493 bool Demuxer::writeVideo()
495 return videostream.drain();
498 bool Demuxer::writeTeletext()
500 return teletextstream.drain();
503 bool Demuxer::submitPacket(PESPacket& packet)
506 UCHAR packet_type = packet.getPacketType();
507 const UCHAR* packetdata = packet.getData();
508 if (packet_type >= PESTYPE_VID0 && packet_type <= PESTYPE_VIDMAX)
510 if (video_current == -1) video_current = packet_type;
511 if (video_current == packet_type && !vid_seeking)
513 sent = videostream.put(&packetdata[0], packet.getSize(), h264?MPTYPE_VIDEO_H264:MPTYPE_VIDEO_MPEG2,packetnum);
514 if (sent) packetnum++;
517 sent = packet.getSize();
519 else if (packet_type >= PESTYPE_AUD0 && packet_type <= PESTYPE_AUDMAX)
521 if (audio_current == -1) audio_current = packet_type;
522 avail_mpaudchan[packet_type - PESTYPE_AUD0] = true;
523 if (audio_current == packet_type && !aud_seeking)
525 sent = audiostream.put(&packetdata[0], packet.getSize(), MPTYPE_MPEG_AUDIO,packetnum);
526 if (sent) packetnum++;
529 sent = packet.getSize();
531 else if (packet_type == PESTYPE_PRIVATE_1 &&
532 packet.getSubstream() >= PESTYPE_SUBSTREAM_AC30 &&
533 packet.getSubstream() <= PESTYPE_SUBSTREAM_AC3MAX)
535 avail_ac3audchan[packet.getSubstream() - PESTYPE_SUBSTREAM_AC30] = true;
536 if (packet.getSubstream() == audio_current)
538 sent = audiostream.put(&packetdata[0], packet.getSize(), (ispre_1_3_19)? MPTYPE_AC3_PRE13 : MPTYPE_AC3,packetnum);
539 if (sent) packetnum++;
543 sent = packet.getSize();
546 else if (packet_type == PESTYPE_PRIVATE_1 &&
547 packet.getSubstream() >= PESTYPE_SUBSTREAM_DVBSUBTITLE0 &&
548 packet.getSubstream() <= PESTYPE_SUBSTREAM_DVBSUBTITLEMAX)
550 avail_dvbsubtitlechan[packet.getSubstream()-PESTYPE_SUBSTREAM_DVBSUBTITLE0]=true;
551 if (subtitle_current == -1) subtitle_current = packet.getSubstream();
552 if (subtitles && packet.getSubstream()==subtitle_current)
554 subtitles->put(packet);
556 sent = packet.getSize();
558 else if (isteletextdecoded && packet_type == PESTYPE_PRIVATE_1 &&
559 packet.getSubstream() >= PESTYPE_SUBSTREAM_TELETEXT0 &&
560 packet.getSubstream() <= PESTYPE_SUBSTREAM_TELETEXTMAX)
563 if (teletext_current == -1) teletext_current = packet.getSubstream();
564 if (teletext_current == packet.getSubstream() )
566 sent = teletextstream.put(&packetdata[0], packet.getSize(), MPTYPE_TELETEXT,packetnum);
570 sent = packet.getSize();
575 sent = packet.getSize();
578 if (sent < packet.getSize()) // Stream is full.
584 void Demuxer::parsePacketDetails(PESPacket& packet)
586 if (packet.getPacketType() >= PESTYPE_AUD0 &&
587 packet.getPacketType() <= PESTYPE_AUDMAX)
589 // Extract audio PTS if it exists
592 audio_pts = packet.getPTS();
593 // We continue to seek on the audio if the video PTS that we
594 // are trying to match is ahead of the audio PTS by at most
595 // SEEK_THRESHOLD. We consider the possibility of PTS wrap.
596 if (aud_seeking && !vid_seeking &&
597 !( (video_pts_seek > audio_pts &&
598 video_pts_seek - audio_pts < SEEK_THRESHOLD)
600 (video_pts_seek < audio_pts &&
601 video_pts_seek + (1LL<<33) - audio_pts < SEEK_THRESHOLD) ))
604 Log::getInstance()->log("Demuxer", Log::DEBUG,
605 "Leaving audio sync: Audio PTS = %llu", audio_pts);
609 else if (packet.getPacketType() == PESTYPE_PRIVATE_1) // Private stream
611 //Inspired by vdr's device.c
612 int payload_begin = packet[8]+9;
613 unsigned char substream_id = packet[payload_begin];
614 unsigned char substream_type = substream_id & 0xF0;
615 unsigned char substream_index = substream_id & 0x1F;
616 pre_1_3_19_Recording: //This is for old recordings stuff and live TV
619 substream_id = PESTYPE_PRIVATE_1;
620 substream_type = 0x80;
623 switch (substream_type)
627 packet.setSubstream(substream_id);
629 case 0xA0: //LPCM //not supported yet, is there any LPCM transmissio out there?
631 case 0x80: //ac3, currently only one ac3 track per recording supported
632 packet.setSubstream(substream_type+substream_index);
634 // Extract audio PTS if it exists
637 audio_pts = packet.getPTS();
638 // We continue to seek on the audio if the video PTS that we
639 // are trying to match is ahead of the audio PTS by at most
640 // SEEK_THRESHOLD. We consider the possibility of PTS wrap.
641 if (aud_seeking && !vid_seeking &&
642 !( (video_pts_seek > audio_pts &&
643 video_pts_seek - audio_pts < SEEK_THRESHOLD)
645 (video_pts_seek < audio_pts &&
646 video_pts_seek + (1LL<<33) - audio_pts < SEEK_THRESHOLD) ))
649 Log::getInstance()->log("Demuxer", Log::DEBUG, "Leaving audio sync: Audio PTS = %llu", audio_pts);
653 case 0x10: //Teletext Is this correct?
654 packet.setSubstream(substream_id);
655 // Extract teletxt PTS if it exists
658 teletext_pts = packet.getPTS();
664 ispre_1_3_19=true; //switching to compat mode and live tv mode
665 goto pre_1_3_19_Recording;
669 packet.setSubstream(0);
674 else if (packet.getPacketType() >= PESTYPE_VID0 &&
675 packet.getPacketType() <= PESTYPE_VIDMAX)
677 // Extract video PTS if it exists
678 if (packet.hasPTS()) video_pts = packet.getPTS();
680 // If there is a sequence header, extract information
681 UINT pos = packet.findSeqHeader(h264);
686 if (pos+6 >= packet.getSize()) return;
687 horizontal_size = ((int)packet[pos] << 4) | ((int)packet[pos+1] >> 4);
689 vertical_size = (((int)packet[pos+1] & 0xf) << 8) | (int)packet[pos+2];
691 setAspectRatio((enum AspectRatio)(packet[pos+3] >> 4));
692 frame_rate = packet[pos+3] & 0x0f;
693 if (frame_rate >= 1 && frame_rate <= 8)
694 frame_rate = FrameRates[frame_rate];
697 bit_rate = ((int)packet[pos+4] << 10) |
698 ((int)packet[pos+5] << 2) |
699 ((int)packet[pos+6] >> 6);
703 /* Chris and Mark I know this is ugly, should we move this to a method of PESPacket or to NALUUnit what would be better?
704 This looks so ugly since the header includes variable length parts and I have to parse through the whole header to get the wanted information*/
705 NALUUnit nalu(packet.getData()+pos,packet.getSize()-pos);
706 profile=nalu.getBits(8);
707 nalu.getBits(8); //constraints
708 nalu.getBits(8); //level_idc
709 nalu.getUe(); //seq_parameter_set_id
710 if (profile==100 || profile==110 || profile==122 || profile==144)
716 nalu.getUe(); //bit depth lume
717 nalu.getUe(); //bit depth chrome
721 for (int i=0;i<8;i++){
728 for (int j=0;j<16;j++) {
730 UINT delta=nalu.getSe();
731 nextscale=(lastscale+delta+256)%256;
733 lastscale=(nextscale==0)?lastscale:nextscale;
740 for (int j=0;j<64;j++) {
742 UINT delta=nalu.getSe();
743 nextscale=(lastscale+delta+256)%256;
745 lastscale=(nextscale==0)?lastscale:nextscale;
752 nalu.getUe(); //log2framenum
753 UINT temp=nalu.getUe();
754 if (temp==0) //pict order
760 UINT temp2=nalu.getUe();
761 for (int i=0;i<temp2;i++)
764 nalu.getUe(); //Num refframes
766 horizontal_size=(nalu.getUe()+1)*16;
768 vertical_size=(nalu.getUe()+1)*16;
769 int interlaced=nalu.getBits(1);
770 vertical_size*=(2-interlaced);
772 if (!interlaced) nalu.getBits(1);
785 UINT aspectratioidc=nalu.getBits(8);
786 bool hasaspect=false;
787 const float aspects[]={1., 1./1.,12./11.,10./11.,16./11.,40./33.,
788 24./11.,20./11.,32./11.,80./33.,18./11.,15./11.,64./33.,160./99.,4./3.,3./2.,2./1.};
790 float aspectratio=((float) horizontal_size)/((float) vertical_size);
791 if (aspectratioidc<=16)
794 aspectratio*=aspects[aspectratioidc];
797 else if (aspectratioidc==255)
799 int t_sar_width=nalu.getBits(16);
800 int t_sar_height=nalu.getBits(16);
801 if (t_sar_width!=0 && t_sar_height!=0)
804 aspectratio*=((float)t_sar_width)/((float)t_sar_height);
809 if (fabs(aspectratio-16./9.)<0.1) setAspectRatio(ASPECT_16_9);
810 else if (fabs(aspectratio-4./3.)<0.1) setAspectRatio(ASPECT_4_3);
821 video_pts_seek = video_pts;
822 Log::getInstance()->log("Demuxer", Log::DEBUG,
823 "Entering audio sync: Video PTS = %llu", video_pts);
824 Log::getInstance()->log("Demuxer", Log::DEBUG,
825 "Entering audio sync: Audio PTS = %llu", audio_pts);
832 UINT Demuxer::stripAudio(UCHAR* buf, UINT len)
834 UINT read_pos = 0, write_pos = 0;
835 UINT pattern, packet_length;
836 if (len < 4) return 0;
837 pattern = (buf[0] << 16) | (buf[1] << 8) | (buf[2]);
838 while (read_pos + 7 <= len)
840 pattern = ((pattern & 0xFFFFFF) << 8) | buf[read_pos+3];
841 if (pattern < (0x100|PESTYPE_VID0) || pattern > (0x100|PESTYPE_VIDMAX))
845 packet_length = ((buf[read_pos+4] << 8) | (buf[read_pos+5])) + 6;
846 if (read_pos + packet_length > len)
850 if (read_pos != write_pos)
851 memmove(buf+write_pos, buf+read_pos, packet_length);
852 read_pos += packet_length;
853 write_pos += packet_length;
854 pattern = (buf[read_pos] << 16) | (buf[read_pos+1] << 8)
862 bool Demuxer::scanForVideo(UCHAR* buf, UINT len, bool &ish264)
867 if (len < 4) return false;
868 pattern = (buf[0] << 16) | (buf[1] << 8) | (buf[2]);
871 pattern = ((pattern & 0xFFFFFF) << 8) | buf[pos++];
872 if (pattern >= (0x100|PESTYPE_VID0) && pattern <= (0x100|PESTYPE_VIDMAX))
878 bool* Demuxer::getmpAudioChannels()
880 return avail_mpaudchan;
883 bool* Demuxer::getac3AudioChannels()
885 return avail_ac3audchan;
888 bool* Demuxer::getSubtitleChannels()
890 return avail_dvbsubtitlechan;
893 int Demuxer::getselSubtitleChannel()
895 return subtitle_current;
898 int Demuxer::getselAudioChannel()
900 return audio_current;