void avi_reader_c::extended_identify_mpeg4_l2(std::vector<std::string> &extended_info) { int size = AVI_frame_size(m_avi, 0); if (0 >= size) return; memory_cptr af_buffer = memory_c::alloc(size); unsigned char *buffer = af_buffer->get_buffer(); int dummy_key; AVI_read_frame(m_avi, reinterpret_cast<char *>(buffer), &dummy_key); uint32_t par_num, par_den; if (mpeg4::p2::extract_par(buffer, size, par_num, par_den)) { int width = AVI_video_width(m_avi); int height = AVI_video_height(m_avi); float aspect_ratio = static_cast<float>(width) * par_num / height / par_den; int disp_width, disp_height; if (aspect_ratio > (static_cast<float>(width) / height)) { disp_width = irnd(height * aspect_ratio); disp_height = height; } else { disp_width = width; disp_height = irnd(width / aspect_ratio); } extended_info.push_back((boost::format("display_dimensions:%1%x%2%") % disp_width % disp_height).str()); } }
void theora_parse_identification_header(unsigned char *buffer, int size, theora_identification_header_t &header) { bit_reader_c bc(buffer, size); int i; header.headertype = bc.get_bits(8); if (THEORA_HEADERTYPE_IDENTIFICATION != header.headertype) throw mtx::theora::header_parsing_x(boost::format(Y("Wrong header type: 0x%|1$02x| != 0x%|2$02x|")) % header.headertype % THEORA_HEADERTYPE_IDENTIFICATION); for (i = 0; 6 > i; ++i) header.theora_string[i] = bc.get_bits(8); if (strncmp(header.theora_string, "theora", 6)) throw mtx::theora::header_parsing_x(boost::format(Y("Wrong identifaction string: '%|1$6s|' != 'theora'")) % header.theora_string); header.vmaj = bc.get_bits(8); header.vmin = bc.get_bits(8); header.vrev = bc.get_bits(8); if ((3 != header.vmaj) || (2 != header.vmin)) throw mtx::theora::header_parsing_x(boost::format(Y("Wrong Theora version: %1%.%2%.%3% != 3.2.x")) % header.vmaj % header.vmin % header.vrev); header.fmbw = bc.get_bits(16) * 16; header.fmbh = bc.get_bits(16) * 16; header.picw = bc.get_bits(24); header.pich = bc.get_bits(24); header.picx = bc.get_bits(8); header.picy = bc.get_bits(8); header.frn = bc.get_bits(32); header.frd = bc.get_bits(32); header.parn = bc.get_bits(24); header.pard = bc.get_bits(24); header.cs = bc.get_bits(8); header.nombr = bc.get_bits(24); header.qual = bc.get_bits(6); header.kfgshift = bc.get_bits(5); header.pf = bc.get_bits(2); if ((0 != header.parn) && (0 != header.pard)) { if (((float)header.fmbw / (float)header.fmbh) < ((float)header.parn / (float)header.pard)) { header.display_width = irnd((float)header.fmbw * header.parn / header.pard); header.display_height = header.fmbh; } else { header.display_width = header.fmbw; header.display_height = irnd((float)header.fmbh * header.pard / header.parn); } } }
void wxKnob::OnPaint(wxPaintEvent& WXUNUSED(event)) { int sizeX, sizeY; double theta; double dx, dy; int cx, cy; int r, r2; wxSize s = GetSize (); theta = (Pi / 180.) * (m_maxAngle + (((double) m_max - m_setting) / (m_max - m_min)) * m_range); dx = cos (theta); dy = -sin (theta); // - because of upside down coordinates wxPaintDC dc(this); GetCenter (cx, cy); r = irnd (((s.x < s.y) ? s.x : s.y) * .48); r2 = irnd (r * .6); // dc.BeginDrawing(); dc.SetPen (*wxBLACK_PEN); dc.DrawCircle (cx, cy, r); dc.DrawLine (cx + irnd (r * dx), cy + irnd (r * dy), cx + irnd (r2 * dx), cy + irnd (r2 * dy)); // dc.EndDrawing(); }
file_status_e tta_reader_c::read(generic_packetizer_c *, bool) { if (seek_points.size() <= pos) return flush_packetizers(); unsigned char *buf = (unsigned char *)safemalloc(seek_points[pos]); int nread = m_in->read(buf, seek_points[pos]); if (0 >= nread) return flush_packetizers(); pos++; memory_cptr mem(new memory_c(buf, nread, true)); if (seek_points.size() <= pos) { double samples_left = (double)get_uint32_le(&header.data_length) - (seek_points.size() - 1) * TTA_FRAME_TIME * get_uint32_le(&header.sample_rate); mxverb(2, boost::format("tta: samples_left %1%\n") % samples_left); PTZR0->process(new packet_t(mem, -1, irnd(samples_left * 1000000000.0l / get_uint32_le(&header.sample_rate)))); } else PTZR0->process(new packet_t(mem)); return seek_points.size() <= pos ? flush_packetizers() : FILE_STATUS_MOREDATA; }
double rnd(void) /* 0 <= rnd() < 1 */ { return (1.0 / (ULONG_MAX + 1.0)) * irnd(); }