static irqreturn_t vmpeg12_isr(int irq, void *dev_id) { u32 reg, info, seqinfo, offset, pts, pts_valid = 0; vframe_t *vf; ulong flags; WRITE_MPEG_REG(ASSIST_MBOX1_CLR_REG, 1); reg = READ_MPEG_REG(MREG_BUFFEROUT); if (reg) { info = READ_MPEG_REG(MREG_PIC_INFO); offset = READ_MPEG_REG(MREG_FRAME_OFFSET); info = info | PICINFO_TOP_FIRST; if (((info & PICINFO_TYPE_MASK) == PICINFO_TYPE_I) && (pts_lookup_offset(PTS_TYPE_VIDEO, offset, &pts, 0) == 0)) { pts_valid = 1; } /*if (frame_prog == 0)*/ { frame_prog = info & PICINFO_PROG; } if ((dec_control & DEC_CONTROL_FLAG_FORCE_2500_720_576_INTERLACE) && (frame_width == 720) && (frame_height == 576) && (frame_dur == 3840)) { frame_prog = 0; } else if ((dec_control & DEC_CONTROL_FLAG_FORCE_3000_704_480_INTERLACE) && (frame_width == 704) && (frame_height == 480) && (frame_dur == 3200)) { frame_prog = 0; } else if ((dec_control & DEC_CONTROL_FLAG_FORCE_2500_704_576_INTERLACE) && (frame_width == 704) && (frame_height == 576) && (frame_dur == 3840)) { frame_prog = 0; } else if ((dec_control & DEC_CONTROL_FLAG_FORCE_2500_544_576_INTERLACE) && (frame_width == 544) && (frame_height == 576) && (frame_dur == 3840)) { frame_prog = 0; } else if ((dec_control & DEC_CONTROL_FLAG_FORCE_2500_480_576_INTERLACE) && (frame_width == 480) && (frame_height == 576) && (frame_dur == 3840)) { frame_prog = 0; } if (frame_prog & PICINFO_PROG) { u32 index = ((reg & 7) - 1) & 3; seqinfo = READ_MPEG_REG(MREG_SEQ_INFO); vf = vfq_pop(&newframe_q); set_frame_info(vf); vf->index = index; vf->type = VIDTYPE_PROGRESSIVE | VIDTYPE_VIU_FIELD; if ((seqinfo & SEQINFO_EXT_AVAILABLE) && (seqinfo & SEQINFO_PROG)) { if (info & PICINFO_RPT_FIRST) { if (info & PICINFO_TOP_FIRST) { vf->duration = vf->duration * 3; // repeat three times } else { vf->duration = vf->duration * 2; // repeat two times } } vf->duration_pulldown = 0; // no pull down } else { vf->duration_pulldown = (info & PICINFO_RPT_FIRST) ? vf->duration >> 1 : 0; } vf->duration += vf->duration_pulldown; vf->canvas0Addr = vf->canvas1Addr = index2canvas(index); vf->pts = (pts_valid) ? pts : 0; vfbuf_use[index]++; if (error_skip(info, vf)) { spin_lock_irqsave(&lock, flags); vfq_push(&recycle_q, vf); spin_unlock_irqrestore(&lock, flags); } else { vfq_push(&display_q, vf); } vf_notify_receiver(PROVIDER_NAME,VFRAME_EVENT_PROVIDER_VFRAME_READY,NULL); } else {
static irqreturn_t vmjpeg_isr(int irq, void *dev_id) { u32 reg, offset, pts, pts_valid = 0; vframe_t *vf; WRITE_MPEG_REG(ASSIST_MBOX1_CLR_REG, 1); reg = READ_MPEG_REG(MREG_FROM_AMRISC); if (reg & PICINFO_BUF_IDX_MASK) { offset = READ_MPEG_REG(MREG_FRAME_OFFSET); if (pts_lookup_offset(PTS_TYPE_VIDEO, offset, &pts, 0) == 0) { pts_valid = 1; } if ((reg & PICINFO_INTERLACE) == 0) { u32 index = ((reg & PICINFO_BUF_IDX_MASK) - 1) & 3; vfpool_idx[fill_ptr] = index; vf = &vfpool[fill_ptr]; set_frame_info(vf); vf->type = VIDTYPE_PROGRESSIVE | VIDTYPE_VIU_FIELD; vf->canvas0Addr = vf->canvas1Addr = index2canvas0(index); vf->pts = (pts_valid) ? pts : 0; vfbuf_use[index]++; INCPTR(fill_ptr); vf_notify_receiver(PROVIDER_NAME,VFRAME_EVENT_PROVIDER_VFRAME_READY,NULL); } else { u32 index = ((reg & PICINFO_BUF_IDX_MASK) - 1) & 3; vfpool_idx[fill_ptr] = index; vf = &vfpool[fill_ptr]; set_frame_info(vf); #if 0 if (reg & PICINFO_AVI1) { /* AVI1 format */ if (reg & PICINFO_INTERLACE_AVI1_BOT) { vf->type = VIDTYPE_INTERLACE_BOTTOM | VIDTYPE_INTERLACE_FIRST; } else { vf->type = VIDTYPE_INTERLACE_TOP; } } else { if (reg & PICINFO_INTERLACE_FIRST) { vf->type = VIDTYPE_INTERLACE_TOP | VIDTYPE_INTERLACE_FIRST; } else { vf->type = VIDTYPE_INTERLACE_BOTTOM; } } vf->type |= VIDTYPE_VIU_FIELD; vf->duration >>= 1; vf->canvas0Addr = vf->canvas1Addr = index2canvas0(index); if ((vf->type & VIDTYPE_INTERLACE_FIRST) && (pts_valid)) { vf->pts = pts; } else { vf->pts = 0; } vfbuf_use[index]++; INCPTR(fill_ptr); #else /* send whole frame by weaving top & bottom field */ vf->type = VIDTYPE_PROGRESSIVE; vf->canvas0Addr = index2canvas0(index); vf->canvas1Addr = index2canvas1(index); if (pts_valid) { vf->pts = pts; } else { vf->pts = 0; } vfbuf_use[index]++; INCPTR(fill_ptr); vf_notify_receiver(PROVIDER_NAME,VFRAME_EVENT_PROVIDER_VFRAME_READY,NULL); #endif } WRITE_MPEG_REG(MREG_FROM_AMRISC, 0); }
static int kvazaar_encode(kvz_encoder *enc, kvz_picture *pic_in, kvz_data_chunk **data_out, uint32_t *len_out, kvz_picture **pic_out, kvz_picture **src_out, kvz_frame_info *info_out) { if (data_out) *data_out = NULL; if (len_out) *len_out = 0; if (pic_out) *pic_out = NULL; if (src_out) *src_out = NULL; encoder_state_t *state = &enc->states[enc->cur_state_num]; if (!state->prepared) { kvz_encoder_next_frame(state); } if (pic_in != NULL) { // FIXME: The frame number printed here is wrong when GOP is enabled. CHECKPOINT_MARK("read source frame: %d", state->global->frame + enc->control->cfg->seek); } if (kvz_encoder_feed_frame(&enc->input_buffer, state, pic_in)) { assert(state->global->frame == enc->frames_started); // Start encoding. kvz_encode_one_frame(state); enc->frames_started += 1; } // If we have finished encoding as many frames as we have started, we are done. if (enc->frames_done == enc->frames_started) { return 1; } if (!state->frame_done) { // We started encoding a frame; move to the next encoder state. enc->cur_state_num = (enc->cur_state_num + 1) % (enc->num_encoder_states); } encoder_state_t *output_state = &enc->states[enc->out_state_num]; if (!output_state->frame_done && (pic_in == NULL || enc->cur_state_num == enc->out_state_num)) { kvz_threadqueue_waitfor(enc->control->threadqueue, output_state->tqj_bitstream_written); // The job pointer must be set to NULL here since it won't be usable after // the next frame is done. output_state->tqj_bitstream_written = NULL; // Get stream length before taking chunks since that clears the stream. if (len_out) *len_out = kvz_bitstream_tell(&output_state->stream) / 8; if (data_out) *data_out = kvz_bitstream_take_chunks(&output_state->stream); if (pic_out) *pic_out = kvz_image_copy_ref(output_state->tile->frame->rec); if (src_out) *src_out = kvz_image_copy_ref(output_state->tile->frame->source); if (info_out) set_frame_info(info_out, output_state); output_state->frame_done = 1; output_state->prepared = 0; enc->frames_done += 1; enc->out_state_num = (enc->out_state_num + 1) % (enc->num_encoder_states); } return 1; }
static irqreturn_t vmjpeg_isr(int irq, void *dev_id) { u32 reg, offset, pts, pts_valid = 0; vframe_t *vf = NULL; WRITE_VREG(ASSIST_MBOX1_CLR_REG, 1); reg = READ_VREG(MREG_FROM_AMRISC); if (reg & PICINFO_BUF_IDX_MASK) { offset = READ_VREG(MREG_FRAME_OFFSET); if (pts_lookup_offset(PTS_TYPE_VIDEO, offset, &pts, 0) == 0) { pts_valid = 1; } if ((reg & PICINFO_INTERLACE) == 0) { u32 index = ((reg & PICINFO_BUF_IDX_MASK) - 1) & 3; if (index >= DECODE_BUFFER_NUM_MAX) { printk("fatal error, invalid buffer index."); return IRQ_HANDLED; } if (kfifo_get(&newframe_q, &vf) == 0) { printk("fatal error, no available buffer slot."); return IRQ_HANDLED; } set_frame_info(vf); vf->index = index; #ifdef NV21 vf->type = VIDTYPE_PROGRESSIVE | VIDTYPE_VIU_FIELD | VIDTYPE_VIU_NV21; #else vf->type = VIDTYPE_PROGRESSIVE | VIDTYPE_VIU_FIELD; #endif vf->canvas0Addr = vf->canvas1Addr = index2canvas0(index); vf->pts = (pts_valid) ? pts : 0; vf->orientation = 0 ; vfbuf_use[index]++; kfifo_put(&display_q, (const vframe_t **)&vf); vf_notify_receiver(PROVIDER_NAME,VFRAME_EVENT_PROVIDER_VFRAME_READY,NULL); } else { u32 index = ((reg & PICINFO_BUF_IDX_MASK) - 1) & 3; if (index >= DECODE_BUFFER_NUM_MAX) { printk("fatal error, invalid buffer index."); return IRQ_HANDLED; } if (kfifo_get(&newframe_q, &vf) == 0) { printk("fatal error, no available buffer slot."); return IRQ_HANDLED; } set_frame_info(vf); vf->index = index; #if 0 if (reg & PICINFO_AVI1) { /* AVI1 format */ if (reg & PICINFO_INTERLACE_AVI1_BOT) { vf->type = VIDTYPE_INTERLACE_BOTTOM | VIDTYPE_INTERLACE_FIRST; } else { vf->type = VIDTYPE_INTERLACE_TOP; } } else { if (reg & PICINFO_INTERLACE_FIRST) { vf->type = VIDTYPE_INTERLACE_TOP | VIDTYPE_INTERLACE_FIRST; } else { vf->type = VIDTYPE_INTERLACE_BOTTOM; } } vf->type |= VIDTYPE_VIU_FIELD; #ifdef NV21 vf->type |= VIDTYPE_VIU_NV21; #endif vf->duration >>= 1; vf->canvas0Addr = vf->canvas1Addr = index2canvas0(index); vf->orientation = 0 ; if ((vf->type & VIDTYPE_INTERLACE_FIRST) && (pts_valid)) { vf->pts = pts; } else { vf->pts = 0; } vfbuf_use[index]++; kfifo_put(&display_q, (const vframe_t **)&vf); #else /* send whole frame by weaving top & bottom field */ #ifdef NV21 vf->type = VIDTYPE_PROGRESSIVE | VIDTYPE_VIU_NV21; #else vf->type = VIDTYPE_PROGRESSIVE; #endif vf->canvas0Addr = index2canvas0(index); vf->canvas1Addr = index2canvas1(index); vf->orientation = 0 ; if (pts_valid) { vf->pts = pts; } else { vf->pts = 0; } vfbuf_use[index]++; kfifo_put(&display_q, (const vframe_t **)&vf); vf_notify_receiver(PROVIDER_NAME,VFRAME_EVENT_PROVIDER_VFRAME_READY,NULL); #endif } WRITE_VREG(MREG_FROM_AMRISC, 0); }