Skip to content
Snippets Groups Projects
vc1.c 143 KiB
Newer Older
  • Learn to ignore specific revisions
  •             }
            }else if(v->interlace && ((buf[0] & 0xC0) == 0xC0)){ /* WVC1 interlaced stores both fields divided by marker */
    
    Aurelien Jacobs's avatar
    Aurelien Jacobs committed
                const uint8_t *divider;
    
    
                divider = find_next_marker(buf, buf + buf_size);
                if((divider == (buf + buf_size)) || AV_RB32(divider) != VC1_CODE_FIELD){
                    av_log(avctx, AV_LOG_ERROR, "Error in WVC1 interlaced frame\n");
                    return -1;
                }
    
                buf_size2 = vc1_unescape_buffer(buf, divider - buf, buf2);
                // TODO
                av_free(buf2);return -1;
            }else{
                buf_size2 = vc1_unescape_buffer(buf, buf_size, buf2);
    
            }
            init_get_bits(&s->gb, buf2, buf_size2*8);
        } else
            init_get_bits(&s->gb, buf, buf_size*8);
    
        if(v->profile < PROFILE_ADVANCED) {
            if(vc1_parse_frame_header(v, &s->gb) == -1) {
    
                return -1;
            }
        } else {
            if(vc1_parse_frame_header_adv(v, &s->gb) == -1) {
    
        if(s->pict_type != I_TYPE && !v->res_rtm_flag){
    
    anonymous's avatar
    anonymous committed
    
        // for hurry_up==5
        s->current_picture.pict_type= s->pict_type;
        s->current_picture.key_frame= s->pict_type == I_TYPE;
    
    
        /* skip B-frames if we don't have reference frames */
    
        if(s->last_picture_ptr==NULL && (s->pict_type==B_TYPE || s->dropable)){
    
    anonymous's avatar
    anonymous committed
        /* skip b frames if we are in a hurry */
    
        if(avctx->hurry_up && s->pict_type==B_TYPE) return -1;//buf_size;
        if(   (avctx->skip_frame >= AVDISCARD_NONREF && s->pict_type==B_TYPE)
           || (avctx->skip_frame >= AVDISCARD_NONKEY && s->pict_type!=I_TYPE)
    
           ||  avctx->skip_frame >= AVDISCARD_ALL) {
    
    anonymous's avatar
    anonymous committed
        /* skip everything if we are in a hurry>=5 */
    
    anonymous's avatar
    anonymous committed
        if(s->next_p_frame_damaged){
            if(s->pict_type==B_TYPE)
    
    anonymous's avatar
    anonymous committed
            else
                s->next_p_frame_damaged=0;
        }
    
    
    anonymous's avatar
    anonymous committed
            return -1;
    
    anonymous's avatar
    anonymous committed
    
    
        s->me.qpel_put= s->dsp.put_qpel_pixels_tab;
        s->me.qpel_avg= s->dsp.avg_qpel_pixels_tab;
    
    
    anonymous's avatar
    anonymous committed
        ff_er_frame_start(s);
    
    
        v->bits = buf_size * 8;
        vc1_decode_blocks(v);
    //av_log(s->avctx, AV_LOG_INFO, "Consumed %i/%i bits\n", get_bits_count(&s->gb), buf_size*8);
    //  if(get_bits_count(&s->gb) > buf_size * 8)
    //      return -1;
    
    anonymous's avatar
    anonymous committed
        ff_er_frame_end(s);
    
        MPV_frame_end(s);
    
    
    assert(s->current_picture.pict_type == s->current_picture_ptr->pict_type);
    assert(s->current_picture.pict_type == s->pict_type);
    
        if (s->pict_type == B_TYPE || s->low_delay) {
            *pict= *(AVFrame*)s->current_picture_ptr;
        } else if (s->last_picture_ptr != NULL) {
            *pict= *(AVFrame*)s->last_picture_ptr;
        }
    
        if(s->last_picture_ptr || s->low_delay){
            *data_size = sizeof(AVFrame);
    
    anonymous's avatar
    anonymous committed
            ff_print_debug_info(s, pict);
        }
    
        /* Return the Picture timestamp as the frame number */
    
        /* we subtract 1 because it is added on utils.c     */
    
    anonymous's avatar
    anonymous committed
        avctx->frame_number = s->picture_number - 1;
    
    
    /** Close a VC1/WMV3 decoder
    
     * @warning Initial try at using MpegEncContext stuff
     */
    
    static int vc1_decode_end(AVCodecContext *avctx)
    
        VC1Context *v = avctx->priv_data;
    
        av_freep(&v->hrd_rate);
        av_freep(&v->hrd_buffer);
    
    anonymous's avatar
    anonymous committed
        MPV_common_end(&v->s);
    
        av_freep(&v->mv_type_mb_plane);
    
        av_freep(&v->acpred_plane);
        av_freep(&v->over_flags_plane);
    
    Kostya Shishkov's avatar
    Kostya Shishkov committed
        av_freep(&v->mb_type_base);
    
        ff_intrax8_common_end(&v->x8);
    
    AVCodec vc1_decoder = {
        "vc1",
    
        CODEC_ID_VC1,
        sizeof(VC1Context),
        vc1_decode_init,
    
        vc1_decode_end,
        vc1_decode_frame,
    
        sizeof(VC1Context),
        vc1_decode_init,
    
        vc1_decode_end,
        vc1_decode_frame,