generic_packetizer_c * wav_dts_demuxer_c::create_packetizer() { m_ptzr = new dts_packetizer_c(m_reader, m_ti, m_dtsheader); // .wav with DTS are always filled up with other stuff to match the bitrate. static_cast<dts_packetizer_c *>(m_ptzr)->set_skipping_is_normal(true); show_packetizer_info(0, m_ptzr); if (1 < verbose) m_dtsheader.print(); return m_ptzr; }
bool wav_dts_demuxer_c::probe(mm_io_cptr &io) { io->save_pos(); int len = io->read(m_buf[m_cur_buf]->get_buffer(), DTS_READ_SIZE); io->restore_pos(); if (mtx::dts::detect(m_buf[m_cur_buf]->get_buffer(), len, m_pack_14_16, m_swap_bytes)) { len = decode_buffer(len); int pos = mtx::dts::find_consecutive_headers(m_buf[m_cur_buf]->get_buffer(), len, 5); if (0 <= pos) { if (0 > mtx::dts::find_header(m_buf[m_cur_buf]->get_buffer() + pos, len - pos, m_dtsheader)) return false; m_codec.set_specialization(m_dtsheader.get_codec_specialization()); mxverb(3, boost::format("DTSinWAV: 14->16 %1% swap %2%\n") % m_pack_14_16 % m_swap_bytes); return true; } } return false; }
memory_cptr dts_packetizer_c::get_dts_packet(mtx::dts::header_t &dtsheader, bool flushing) { if (0 == m_packet_buffer.get_size()) return nullptr; const unsigned char *buf = m_packet_buffer.get_buffer(); int buf_size = m_packet_buffer.get_size(); int pos = mtx::dts::find_sync_word(buf, buf_size); if (0 > pos) { if (4 < buf_size) m_packet_buffer.remove(buf_size - 4); return nullptr; } if (0 < pos) { m_packet_buffer.remove(pos); buf = m_packet_buffer.get_buffer(); buf_size = m_packet_buffer.get_size(); } pos = mtx::dts::find_header(buf, buf_size, dtsheader, flushing); if ((0 > pos) || (static_cast<int>(pos + dtsheader.frame_byte_size) > buf_size)) return nullptr; if ((1 < verbose) && (dtsheader != m_previous_header)) { mxinfo(Y("DTS header information changed! - New format:\n")); dtsheader.print(); m_previous_header = dtsheader; } if (verbose && (0 < pos) && !m_skipping_is_normal) { int i; bool all_zeroes = true; for (i = 0; i < pos; ++i) if (buf[i]) { all_zeroes = false; break; } if (!all_zeroes) mxwarn_tid(m_ti.m_fname, m_ti.m_id, boost::format(Y("Skipping %1% bytes (no valid DTS header found). This might cause audio/video desynchronisation.\n")) % pos); } auto bytes_to_remove = pos + dtsheader.frame_byte_size; if ( m_reduce_to_core && dtsheader.has_core && dtsheader.has_exss && (dtsheader.exss_part_size > 0) && (dtsheader.exss_part_size < static_cast<int>(dtsheader.frame_byte_size))) { dtsheader.frame_byte_size -= dtsheader.exss_part_size; dtsheader.has_exss = false; } auto packet_buf = memory_c::clone(buf + pos, dtsheader.frame_byte_size); m_packet_buffer.remove(bytes_to_remove); return packet_buf; }