bool StreamReader::rwAsync() { if (nullptr == pool) { pool = std::make_shared<ZMBCommon::ThreadsPool>(2); file_pkt_q->imbue(pool); } ZMBCommon::CallableDoubleFunc readTask; readTask.functor = [=]() { AVPacket pkt; ::memset(&pkt, 0x00, sizeof(AVPacket)); av_init_packet(&pkt); int res = ff.read_frame(&pkt); if (res < 0) { return; } //dispatch the packet for writing: auto avpkt = std::make_shared<av::Packet> (); avpkt->deep_copy(&pkt); av::Rational tb(*ff.get_timebase()); avpkt->setTimeBase(tb); assert(avpkt->getSize() > 0); ZMBCommon::CallableDoubleFunc writeTask; writeTask.functor = [=]() { file_pkt_q->writeAsync(avpkt); }; pool->submit(writeTask); }; pool->submit(readTask); }
void MediaPictureImpl::copy(AVFrame* src, bool complete) { if (!src) VS_THROW(HumbleInvalidArgument("no src")); // release any memory we have av_frame_unref(mFrame); // and copy any data in. av_frame_ref(mFrame, src); RefPointer<Rational> timeBase = getTimeBase(); setTimeBase(timeBase.value()); mComplete=complete; }
// - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - void init(void) { play_led_en(); play_led_off(); dbg_led_en(); dbg_led_on(); // initialize effects sfx_init(); // initialize SPI EEPROM support spie_init(); // initialize USART uart_init(); // setup the UART receive interrupt handler uartBeginReceive(&receiveCallback); // - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - // establish event timer & handler // timer1, event timer // Set CTC mode (Clear Timer on Compare Match) (p.133) // Have to set OCR1A *before anything else*, otherwise it gets reset to 0! PRR &= ~(1<<PRTIM1); OCR1A = (F_CPU / SAMPLE_RATE); TCCR1A = 0; TCCR1B = (1<<WGM12) | // CTC (1<<CS10); TIMSK1 = (1<<OCIE1A); setTimeBase(SAMPLE_RATE); // setup sleep mode set_sleep_mode(SLEEP_MODE_PWR_DOWN); sleep_enable(); // setup switch input SWITCH_DDR &= ~(1<<SWITCH_PIN); SWITCH_PINS |= (1<<SWITCH_PIN); SWITCH_PCMSK |= (1<<SWITCH_PCINT); PCICR |= (1<<SWITCH_PCICR); registerHighPriorityEvent(fadeStatusLed, 0, EVENT_STATE_NONE); registerEvent(readNextStatusVal, 500, EVENT_STATE_NONE); // enable all interrupts sei(); }
bool StreamReader::rwSync() { AVPacket pkt; av_init_packet(&pkt); int res = ff.read_frame(&pkt); if (res >= 0) { /*copy contents*/ auto avpkt = std::make_shared<av::Packet> (&pkt); av::Rational tb(*ff.get_timebase()); avpkt->setTimeBase(tb); assert(avpkt->getSize() > 0); file_pkt_q->writeSync(avpkt); } return res >= 0; }
// - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - // initialize the application void init(void) { _lastChannel = 0; _samples[CHANNEL_BLU] = 0; _samples[CHANNEL_GRN] = 0; // enable ADC & timer1 PRR = (1<<PRTWI) | (1<<PRTIM2) | (0<<PRTIM1) | (1<<PRTIM0) | (0<<PRADC); // prepare ADC ADMUX = (0<<REFS1) | (1<<REFS0) | (1<<ADLAR); // left adjust (ADCH has the most-significant 8 bits) // setup ADCSRA = (1<<ADEN) | (0<<ADSC) | (0<<ADATE) | (1<<ADIF) | (1<<ADIE) | (1<<ADPS2) | // prescale should be ~160 (20mHz/125kHz = 160) (0<<ADPS1) | (1<<ADPS0); // setup ADCSRB = (0<<ACME) | (0<<ADTS2) | (0<<ADTS1) | (0<<ADTS0); // disable digial inputs DIDR0 &= ~((1<<ADC1D) | (1<<ADC0D)); // setup the input channels DDRC &= ~((1<<ADC0D) | (1<<ADC1D)); // setup the LEDs leds_en(); // setup the amp mute aud_ctrl_en(); AUD_CTRL_PORT |= (1<<AUD_CTRL_PIN); // - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - // establish event timer & handler // timer1, event timer // Set CTC mode (Clear Timer on Compare Match) (p.133) // Have to set OCR1A *before anything else*, otherwise it gets reset to 0! OCR1A = (F_CPU / SAMPLE_RATE); TCCR1A = 0; TCCR1B = (1<<WGM12) | // CTC (1<<CS10); TIMSK1 = (1<<OCIE1A); setTimeBase(SAMPLE_RATE); sei(); }
void MediaRaw::setTimeBase(Rational* timeBase) { setTimeBase(timeBase, Rational::ROUND_DOWN); }