int mpeg_ts_track_c::new_stream_v_avc() { if (!m_avc_parser) { m_avc_parser = mpeg4::p10::avc_es_parser_cptr(new mpeg4::p10::avc_es_parser_c); m_avc_parser->ignore_nalu_size_length_errors(); if (map_has_key(reader.m_ti.m_nalu_size_lengths, reader.tracks.size())) m_avc_parser->set_nalu_size_length(reader.m_ti.m_nalu_size_lengths[0]); else if (map_has_key(reader.m_ti.m_nalu_size_lengths, -1)) m_avc_parser->set_nalu_size_length(reader.m_ti.m_nalu_size_lengths[-1]); } mxverb(3, boost::format("new_stream_v_avc: packet size: %1%\n") % pes_payload->get_size()); m_avc_parser->add_bytes(pes_payload->get_buffer(), pes_payload->get_size()); if (!m_avc_parser->headers_parsed()) return FILE_STATUS_MOREDATA; fourcc = FOURCC('A', 'V', 'C', '1'); v_width = m_avc_parser->get_width(); v_height = m_avc_parser->get_height(); if (m_avc_parser->has_par_been_found()) { auto dimensions = m_avc_parser->get_display_dimensions(); v_dwidth = dimensions.first; v_dheight = dimensions.second; } return 0; }
void avi_reader_c::create_video_packetizer() { size_t i; mxverb_tid(4, m_ti.m_fname, 0, "frame sizes:\n"); for (i = 0; i < m_max_video_frames; i++) { m_bytes_to_process += AVI_frame_size(m_avi, i); mxverb(4, boost::format(" %1%: %2%\n") % i % AVI_frame_size(m_avi, i)); } if (m_avi->bitmap_info_header) { m_ti.m_private_data = memory_c::clone(m_avi->bitmap_info_header, get_uint32_le(&m_avi->bitmap_info_header->bi_size)); mxverb(4, boost::format("track extra data size: %1%\n") % (m_ti.m_private_data->get_size() - sizeof(alBITMAPINFOHEADER))); if (sizeof(alBITMAPINFOHEADER) < m_ti.m_private_data->get_size()) mxverb(4, boost::format(" %1%\n") % to_hex(m_ti.m_private_data->get_buffer() + sizeof(alBITMAPINFOHEADER), m_ti.m_private_data->get_size() - sizeof(alBITMAPINFOHEADER))); } const char *codec = AVI_video_compressor(m_avi); if (mpeg4::p2::is_v3_fourcc(codec)) m_divx_type = DIVX_TYPE_V3; else if (mpeg4::p2::is_fourcc(codec)) m_divx_type = DIVX_TYPE_MPEG4; if (map_has_key(m_ti.m_default_durations, 0)) m_fps = 1000000000.0 / m_ti.m_default_durations[0]; else if (map_has_key(m_ti.m_default_durations, -1)) m_fps = 1000000000.0 / m_ti.m_default_durations[-1]; m_ti.m_id = 0; // ID for the video track. if (DIVX_TYPE_MPEG4 == m_divx_type) create_mpeg4_p2_packetizer(); else if (mpeg4::p10::is_avc_fourcc(codec) && !hack_engaged(ENGAGE_ALLOW_AVC_IN_VFW_MODE)) create_mpeg4_p10_packetizer(); else if (mpeg1_2::is_fourcc(get_uint32_le(codec))) create_mpeg1_2_packetizer(); else if (FOURCC('V', 'P', '8', '0') == get_uint32_be(codec)) create_vp8_packetizer(); else create_standard_video_packetizer(); }
void avi_reader_c::create_ssa_packetizer(int idx) { avi_subs_demuxer_t &demuxer = m_subtitle_demuxers[idx]; int id = idx + 1 + AVI_audio_tracks(m_avi); ssa_parser_c *parser = new ssa_parser_c(this, demuxer.m_text_io.get(), m_ti.m_fname, id); demuxer.m_subs = subtitles_cptr(parser); charset_converter_cptr cc_utf8 = map_has_key(m_ti.m_sub_charsets, id) ? charset_converter_c::init(m_ti.m_sub_charsets[id]) : map_has_key(m_ti.m_sub_charsets, -1) ? charset_converter_c::init(m_ti.m_sub_charsets[-1]) : demuxer.m_text_io->get_byte_order() != BO_NONE ? charset_converter_c::init("UTF-8") : g_cc_local_utf8; parser->set_charset_converter(cc_utf8); parser->set_attachment_id_base(g_attachments.size()); parser->parse(); m_ti.m_private_data = memory_c::clone(parser->get_global()); demuxer.m_ptzr = add_packetizer(new textsubs_packetizer_c(this, m_ti, parser->is_ass() ? MKV_S_TEXTASS : MKV_S_TEXTSSA, false, false)); show_packetizer_info(id, PTZR(demuxer.m_ptzr)); }
void aac_reader_c::read_headers() { try { int tag_size_start = skip_id3v2_tag(*m_in); int tag_size_end = id3_tag_present_at_end(*m_in); if (0 > tag_size_start) tag_size_start = 0; if (0 < tag_size_end) m_size -= tag_size_end; size_t init_read_len = std::min(m_size - tag_size_start, static_cast<uint64_t>(INITCHUNKSIZE)); if (m_in->read(m_chunk, init_read_len) != init_read_len) throw mtx::input::header_parsing_x(); m_in->setFilePointer(tag_size_start, seek_beginning); if (find_aac_header(*m_chunk, init_read_len, &m_aacheader, m_emphasis_present) < 0) throw mtx::input::header_parsing_x(); guess_adts_version(); m_ti.m_id = 0; // ID for this track. int detected_profile = m_aacheader.profile; if (24000 >= m_aacheader.sample_rate) m_aacheader.profile = AAC_PROFILE_SBR; if ( (map_has_key(m_ti.m_all_aac_is_sbr, 0) && m_ti.m_all_aac_is_sbr[ 0]) || (map_has_key(m_ti.m_all_aac_is_sbr, -1) && m_ti.m_all_aac_is_sbr[-1])) m_aacheader.profile = AAC_PROFILE_SBR; if ( (map_has_key(m_ti.m_all_aac_is_sbr, 0) && !m_ti.m_all_aac_is_sbr[ 0]) || (map_has_key(m_ti.m_all_aac_is_sbr, -1) && !m_ti.m_all_aac_is_sbr[-1])) m_aacheader.profile = detected_profile; if ( map_has_key(m_ti.m_all_aac_is_sbr, 0) || map_has_key(m_ti.m_all_aac_is_sbr, -1)) m_sbr_status_set = true; } catch (...) { throw mtx::input::open_x(); } show_demuxer_info(); }