Example #1
0
DVMuxContext* dv_init_mux(AVFormatContext* s)
{
    DVMuxContext *c = (DVMuxContext *)s->priv_data;
    AVStream *vst = NULL;
    int i;

    /* we support at most 1 video and 2 audio streams */
    if (s->nb_streams > 3)
        return NULL;

    c->n_ast = 0;
    c->ast[0] = c->ast[1] = NULL;

    /* We have to sort out where audio and where video stream is */
    for (i=0; i<s->nb_streams; i++) {
         switch (s->streams[i]->codec->codec_type) {
         case CODEC_TYPE_VIDEO:
               vst = s->streams[i];
               break;
         case CODEC_TYPE_AUDIO:
             c->ast[c->n_ast++] = s->streams[i];
             break;
         default:
               goto bail_out;
         }
    }

    /* Some checks -- DV format is very picky about its incoming streams */
    if (!vst || vst->codec->codec_id != CODEC_ID_DVVIDEO)
        goto bail_out;
    for (i=0; i<c->n_ast; i++) {
        if (c->ast[i] && (c->ast[i]->codec->codec_id != CODEC_ID_PCM_S16LE ||
                          c->ast[i]->codec->sample_rate != 48000 ||
                          c->ast[i]->codec->channels != 2))
            goto bail_out;
    }
    c->sys = dv_codec_profile(vst->codec);
    if (!c->sys)
        goto bail_out;

    if((c->n_ast > 1) && (c->sys->n_difchan < 2)) {
        /* only 1 stereo pair is allowed in 25Mbps mode */
        goto bail_out;
    }

    /* Ok, everything seems to be in working order */
    c->frames = 0;
    c->has_audio = 0;
    c->has_video = 0;
    c->start_time = (time_t)s->timestamp;

    for (i=0; i<c->n_ast; i++) {
        if (c->ast[i] && av_fifo_init(&c->audio_data[i], 100*AVCODEC_MAX_AUDIO_FRAME_SIZE) < 0) {
            while (i>0) {
                i--;
                av_fifo_free(&c->audio_data[i]);
            }
            goto bail_out;
        }
    }

    return c;

bail_out:
    return NULL;
}
Example #2
0
static int dvvideo_init(AVCodecContext *avctx)
{
    DVVideoContext *s = avctx->priv_data;
    DSPContext dsp;
    static int done=0;
    int i, j;

    if (!done) {
        VLC dv_vlc;
        uint16_t new_dv_vlc_bits[NB_DV_VLC*2];
        uint8_t new_dv_vlc_len[NB_DV_VLC*2];
        uint8_t new_dv_vlc_run[NB_DV_VLC*2];
        int16_t new_dv_vlc_level[NB_DV_VLC*2];

        done = 1;

        dv_vlc_map = av_mallocz(DV_VLC_MAP_LEV_SIZE*DV_VLC_MAP_RUN_SIZE*sizeof(struct dv_vlc_pair));
	if (!dv_vlc_map)
	    return -ENOMEM;

	/* dv_anchor lets each thread know its Id */
	dv_anchor = av_malloc(12*27*sizeof(void*));
	if (!dv_anchor) {
	    av_free(dv_vlc_map);
	    return -ENOMEM;
	}
	for (i=0; i<12*27; i++)
	    dv_anchor[i] = (void*)(size_t)i;

	/* it's faster to include sign bit in a generic VLC parsing scheme */
	for (i=0, j=0; i<NB_DV_VLC; i++, j++) {
	    new_dv_vlc_bits[j] = dv_vlc_bits[i];
	    new_dv_vlc_len[j] = dv_vlc_len[i];
	    new_dv_vlc_run[j] = dv_vlc_run[i];
	    new_dv_vlc_level[j] = dv_vlc_level[i];
	    
	    if (dv_vlc_level[i]) {
	        new_dv_vlc_bits[j] <<= 1;
		new_dv_vlc_len[j]++;

		j++;
		new_dv_vlc_bits[j] = (dv_vlc_bits[i] << 1) | 1;
		new_dv_vlc_len[j] = dv_vlc_len[i] + 1;
		new_dv_vlc_run[j] = dv_vlc_run[i];
		new_dv_vlc_level[j] = -dv_vlc_level[i];
	    }
	}
             
        /* NOTE: as a trick, we use the fact the no codes are unused
           to accelerate the parsing of partial codes */
        init_vlc(&dv_vlc, TEX_VLC_BITS, j, 
                 new_dv_vlc_len, 1, 1, new_dv_vlc_bits, 2, 2, 0);

        dv_rl_vlc = av_malloc(dv_vlc.table_size * sizeof(RL_VLC_ELEM));
	if (!dv_rl_vlc) {
	    av_free(dv_anchor);
	    av_free(dv_vlc_map);
	    return -ENOMEM;
	}
        for(i = 0; i < dv_vlc.table_size; i++){
            int code= dv_vlc.table[i][0];
            int len = dv_vlc.table[i][1];
            int level, run;
        
            if(len<0){ //more bits needed
                run= 0;
                level= code;
            } else {
                run=   new_dv_vlc_run[code] + 1;
                level= new_dv_vlc_level[code];
            }
            dv_rl_vlc[i].len = len;
            dv_rl_vlc[i].level = level;
            dv_rl_vlc[i].run = run;
        }
	free_vlc(&dv_vlc);

	for (i = 0; i < NB_DV_VLC - 1; i++) {
           if (dv_vlc_run[i] >= DV_VLC_MAP_RUN_SIZE)
	       continue;
#ifdef DV_CODEC_TINY_TARGET
           if (dv_vlc_level[i] >= DV_VLC_MAP_LEV_SIZE)
	       continue;
#endif
	   
	   if (dv_vlc_map[dv_vlc_run[i]][dv_vlc_level[i]].size != 0)
	       continue;
	       
	   dv_vlc_map[dv_vlc_run[i]][dv_vlc_level[i]].vlc = dv_vlc_bits[i] << 
	                                                    (!!dv_vlc_level[i]);
	   dv_vlc_map[dv_vlc_run[i]][dv_vlc_level[i]].size = dv_vlc_len[i] + 
	                                                     (!!dv_vlc_level[i]);
	}
	for (i = 0; i < DV_VLC_MAP_RUN_SIZE; i++) {
#ifdef DV_CODEC_TINY_TARGET
	   for (j = 1; j < DV_VLC_MAP_LEV_SIZE; j++) {
	      if (dv_vlc_map[i][j].size == 0) {
	          dv_vlc_map[i][j].vlc = dv_vlc_map[0][j].vlc |
		            (dv_vlc_map[i-1][0].vlc << (dv_vlc_map[0][j].size));
	          dv_vlc_map[i][j].size = dv_vlc_map[i-1][0].size + 
		                          dv_vlc_map[0][j].size;
	      }
	   }
#else
	   for (j = 1; j < DV_VLC_MAP_LEV_SIZE/2; j++) {
	      if (dv_vlc_map[i][j].size == 0) {
	          dv_vlc_map[i][j].vlc = dv_vlc_map[0][j].vlc |
		            (dv_vlc_map[i-1][0].vlc << (dv_vlc_map[0][j].size));
	          dv_vlc_map[i][j].size = dv_vlc_map[i-1][0].size + 
		                          dv_vlc_map[0][j].size;
	      }
	      dv_vlc_map[i][((uint16_t)(-j))&0x1ff].vlc = 
	                                    dv_vlc_map[i][j].vlc | 1;
	      dv_vlc_map[i][((uint16_t)(-j))&0x1ff].size = 
	                                    dv_vlc_map[i][j].size;
	   }
#endif
	}
    }

    /* Generic DSP setup */
    dsputil_init(&dsp, avctx);
    s->get_pixels = dsp.get_pixels;

    /* 88DCT setup */
    s->fdct[0] = dsp.fdct;
    s->idct_put[0] = dsp.idct_put;
    for (i=0; i<64; i++)
       s->dv_zigzag[0][i] = dsp.idct_permutation[ff_zigzag_direct[i]];

    /* 248DCT setup */
    s->fdct[1] = dsp.fdct248;
    s->idct_put[1] = simple_idct248_put;  // FIXME: need to add it to DSP
    memcpy(s->dv_zigzag[1], ff_zigzag248_direct, 64);

    /* XXX: do it only for constant case */
    dv_build_unquantize_tables(s, dsp.idct_permutation);

    /* FIXME: I really don't think this should be here */
    if (dv_codec_profile(avctx))
	avctx->pix_fmt = dv_codec_profile(avctx)->pix_fmt; 
    avctx->coded_frame = &s->picture;
    
    return 0;
}