void theora_video_packetizer_c::extract_aspect_ratio() { if (display_dimensions_or_aspect_ratio_set() || (NULL == m_ti.m_private_data) || (0 == m_ti.m_private_size)) return; memory_cptr private_data = memory_cptr(new memory_c(m_ti.m_private_data, m_ti.m_private_size, false)); std::vector<memory_cptr> packets = unlace_memory_xiph(private_data); for (auto &packet : packets) { if ((0 == packet->get_size()) || (THEORA_HEADERTYPE_IDENTIFICATION != packet->get_buffer()[0])) continue; try { theora_identification_header_t theora; theora_parse_identification_header(packet->get_buffer(), packet->get_size(), theora); if ((0 == theora.display_width) || (0 == theora.display_height)) return; set_video_display_dimensions(theora.display_width, theora.display_height, PARAMETER_SOURCE_BITSTREAM); mxinfo_tid(m_ti.m_fname, m_ti.m_id, boost::format(Y("Extracted the aspect ratio information from the Theora video headers and set the display dimensions to %1%/%2%.\n")) % theora.display_width % theora.display_height); } catch (...) { } return; } }
void xtr_oggbase_c::create_standard_file(xtr_base_c *master, KaxTrackEntry &track, LacingType lacing) { KaxCodecPrivate *priv = FindChild<KaxCodecPrivate>(&track); if (!priv) mxerror(boost::format(Y("Track %1% with the CodecID '%2%' is missing the \"codec private\" element and cannot be extracted.\n")) % m_tid % m_codec_id); init_content_decoder(track); memory_cptr mpriv = decode_codec_private(priv); std::vector<memory_cptr> header_packets; try { if (lacing == LACING_NONE) header_packets.push_back(mpriv); else { header_packets = unlace_memory_xiph(mpriv); if (header_packets.empty()) throw false; } header_packets_unlaced(header_packets); } catch (...) { mxerror(boost::format(Y("Track %1% with the CodecID '%2%' does not contain valid headers.\n")) % m_tid % m_codec_id); } xtr_oggbase_c::create_file(master, track); ogg_packet op; for (m_packetno = 0; header_packets.size() > m_packetno; ++m_packetno) { // Handle all the header packets: ID header, comments, etc op.b_o_s = (0 == m_packetno ? 1 : 0); op.e_o_s = 0; op.packetno = m_packetno; op.packet = header_packets[m_packetno]->get_buffer(); op.bytes = header_packets[m_packetno]->get_size(); op.granulepos = 0; ogg_stream_packetin(&m_os, &op); if (0 == m_packetno) /* ID header must be alone on a separate page */ flush_pages(); } /* flush at last header, data must start on a new page */ flush_pages(); }