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_oggtheora_c::header_packets_unlaced(std::vector<memory_cptr> &header_packets) { theora_parse_identification_header(header_packets[0]->get_buffer(), header_packets[0]->get_size(), m_theora_header); }