⭐ 欢迎来到虫虫下载站! | 📦 资源下载 📁 资源专辑 ℹ️ 关于我们
⭐ 虫虫下载站

📄 dvbsub.c

📁 video linux conference
💻 C
📖 第 1 页 / 共 5 页
字号:
        bs_write( s, 16, 10 + 6 + (b_text ? 2 : 0) ); /* Segment length */        bs_write( s, 8, i_region );        bs_write( s, 4, p_sys->i_region_ver++ );        /* Region attributes */        bs_write( s, 1, i_bg < i_entries ); /* Fill */        bs_write( s, 3, 0 ); /* Reserved */        bs_write( s, 16, p_sys->p_regions[i_region].i_width );        bs_write( s, 16, p_sys->p_regions[i_region].i_height );        bs_write( s, 3, i_depth );  /* Region level of compatibility */        bs_write( s, 3, i_depth  ); /* Region depth */        bs_write( s, 2, 0 ); /* Reserved */        bs_write( s, 8, 1 ); /* Clut id */        bs_write( s, 8, i_bg ); /* region 8bit pixel code */        bs_write( s, 4, i_bg ); /* region 4bit pixel code */        bs_write( s, 2, i_bg ); /* region 2bit pixel code */        bs_write( s, 2, 0 ); /* Reserved */        /* In our implementation we only have 1 object per region */        bs_write( s, 16, i_region );        bs_write( s, 2, b_text ? DVBSUB_OT_BASIC_CHAR:DVBSUB_OT_BASIC_BITMAP );        bs_write( s, 2, 0 ); /* object provider flag */        bs_write( s, 12, 0 ); /* object horizontal position */        bs_write( s, 4, 0 ); /* Reserved */        bs_write( s, 12, 0 ); /* object vertical position */        if( b_text )        {            bs_write( s, 8, 1 ); /* foreground pixel code */            bs_write( s, 8, 0 ); /* background pixel code */        }    }}static void encode_pixel_data( encoder_t *p_enc, bs_t *s,                               subpicture_region_t *p_region,                               vlc_bool_t b_top );static void encode_object( encoder_t *p_enc, bs_t *s, subpicture_t *p_subpic ){    encoder_sys_t *p_sys = p_enc->p_sys;    subpicture_region_t *p_region;    int i_region;    int i_length_pos, i_update_pos, i_pixel_data_pos;    for( i_region = 0, p_region = p_subpic->p_region; p_region;         p_region = p_region->p_next, i_region++ )    {        bs_write( s, 8, 0x0f ); /* Sync byte */        bs_write( s, 8, DVBSUB_ST_OBJECT_DATA ); /* Segment type */        bs_write( s, 16, 1 ); /* Page id */        i_length_pos = bs_pos( s );        bs_write( s, 16, 0 ); /* Segment length */        bs_write( s, 16, i_region ); /* Object id */        bs_write( s, 4, p_sys->i_region_ver++ );        /* object coding method */        switch( p_region->fmt.i_chroma )        {        case VLC_FOURCC( 'Y','U','V','P' ):            bs_write( s, 2, 0 );            break;        case VLC_FOURCC( 'T','E','X','T' ):            bs_write( s, 2, 1 );            break;        }        bs_write( s, 1, 0 ); /* non modifying color flag */        bs_write( s, 1, 0 ); /* Reserved */        if( p_region->fmt.i_chroma == VLC_FOURCC( 'T','E','X','T' ) )        {            int i_size, i;            if( !p_region->psz_text ) continue;            i_size = __MIN( strlen( p_region->psz_text ), 256 );            bs_write( s, 8, i_size ); /* number of characters in string */            for( i = 0; i < i_size; i++ )            {                bs_write( s, 16, p_region->psz_text[i] );            }                 /* Update segment length */            SetWBE( &s->p_start[i_length_pos/8],                    (bs_pos(s) - i_length_pos)/8 -2 );            continue;        }        /* Coding of a bitmap object */        i_update_pos = bs_pos( s );        bs_write( s, 16, 0 ); /* topfield data block length */        bs_write( s, 16, 0 ); /* bottomfield data block length */        /* Top field */        i_pixel_data_pos = bs_pos( s );        encode_pixel_data( p_enc, s, p_region, VLC_TRUE );        i_pixel_data_pos = ( bs_pos( s ) - i_pixel_data_pos ) / 8;        SetWBE( &s->p_start[i_update_pos/8], i_pixel_data_pos );        /* Bottom field */        i_pixel_data_pos = bs_pos( s );        encode_pixel_data( p_enc, s, p_region, VLC_FALSE );        i_pixel_data_pos = ( bs_pos( s ) - i_pixel_data_pos ) / 8;        SetWBE( &s->p_start[i_update_pos/8+2], i_pixel_data_pos );        /* Stuffing for word alignment */        bs_align_0( s );        if( bs_pos( s ) % 16 ) bs_write( s, 8, 0 );        /* Update segment length */        SetWBE( &s->p_start[i_length_pos/8], (bs_pos(s) - i_length_pos)/8 -2 );    }}static void encode_pixel_line_2bp( encoder_t *p_enc, bs_t *s,                                   subpicture_region_t *p_region,                                   int i_line );static void encode_pixel_line_4bp( encoder_t *p_enc, bs_t *s,                                   subpicture_region_t *p_region,                                   int i_line );static void encode_pixel_line_8bp( encoder_t *p_enc, bs_t *s,                                   subpicture_region_t *p_region,                                   int i_line );static void encode_pixel_data( encoder_t *p_enc, bs_t *s,                               subpicture_region_t *p_region,                               vlc_bool_t b_top ){    unsigned int i_line;    /* Sanity check */    if( p_region->fmt.i_chroma != VLC_FOURCC('Y','U','V','P') ) return;    /* Encode line by line */    for( i_line = !b_top; i_line < p_region->fmt.i_visible_height;         i_line += 2 )    {        switch( p_region->fmt.p_palette->i_entries )        {        case 4:            bs_write( s, 8, 0x10 ); /* 2 bit/pixel code string */            encode_pixel_line_2bp( p_enc, s, p_region, i_line );            break;        case 16:            bs_write( s, 8, 0x11 ); /* 4 bit/pixel code string */            encode_pixel_line_4bp( p_enc, s, p_region, i_line );            break;        case 256:            bs_write( s, 8, 0x12 ); /* 8 bit/pixel code string */            encode_pixel_line_8bp( p_enc, s, p_region, i_line );            break;        default:            msg_Err( p_enc, "subpicture palette (%i) not handled",                     p_region->fmt.p_palette->i_entries );            break;        }        bs_write( s, 8, 0xf0 ); /* End of object line code */    }}static void encode_pixel_line_2bp( encoder_t *p_enc, bs_t *s,                                   subpicture_region_t *p_region,                                   int i_line ){    unsigned int i, i_length = 0;    int i_pitch = p_region->picture.p->i_pitch;    uint8_t *p_data = &p_region->picture.p->p_pixels[ i_pitch * i_line ];    int i_last_pixel = p_data[0];    for( i = 0; i <= p_region->fmt.i_visible_width; i++ )    {        if( i != p_region->fmt.i_visible_width &&            p_data[i] == i_last_pixel && i_length != 284 )        {            i_length++;            continue;        }        if( i_length == 1 || i_length == 11 || i_length == 28 )        {            /* 2bit/pixel code */            if( i_last_pixel ) bs_write( s, 2, i_last_pixel );            else            {                bs_write( s, 2, 0 );                bs_write( s, 1, 0 );                bs_write( s, 1, 1 ); /* pseudo color 0 */            }            i_length--;        }        if( i_length == 2 )        {            if( i_last_pixel )            {                bs_write( s, 2, i_last_pixel );                bs_write( s, 2, i_last_pixel );            }            else            {                bs_write( s, 2, 0 );                bs_write( s, 1, 0 );                bs_write( s, 1, 0 );                bs_write( s, 2, 1 ); /* 2 * pseudo color 0 */            }        }        else if( i_length > 2 )        {            bs_write( s, 2, 0 );            if( i_length <= 10 )            {                bs_write( s, 1, 1 );                bs_write( s, 3, i_length - 3 );                bs_write( s, 2, i_last_pixel );            }            else            {                bs_write( s, 1, 0 );                bs_write( s, 1, 0 );                if( i_length <= 27 )                {                    bs_write( s, 2, 2 );                    bs_write( s, 4, i_length - 12 );                    bs_write( s, 2, i_last_pixel );                }                else                {                    bs_write( s, 2, 3 );                    bs_write( s, 8, i_length - 29 );                    bs_write( s, 2, i_last_pixel );                }            }        }        if( i == p_region->fmt.i_visible_width ) break;        i_last_pixel = p_data[i];        i_length = 1;    }    /* Stop */    bs_write( s, 2, 0 );    bs_write( s, 1, 0 );    bs_write( s, 1, 0 );    bs_write( s, 2, 0 );    /* Stuffing */    bs_align_0( s );}static void encode_pixel_line_4bp( encoder_t *p_enc, bs_t *s,                                   subpicture_region_t *p_region,                                   int i_line ){    unsigned int i, i_length = 0;    int i_pitch = p_region->picture.p->i_pitch;    uint8_t *p_data = &p_region->picture.p->p_pixels[ i_pitch * i_line ];    int i_last_pixel = p_data[0];    for( i = 0; i <= p_region->fmt.i_visible_width; i++ )    {        if( i != p_region->fmt.i_visible_width &&            p_data[i] == i_last_pixel && i_length != 280 )        {            i_length++;            continue;        }        if( i_length == 1 || (i_length == 3 && i_last_pixel) || i_length == 8 )        {            /* 4bit/pixel code */            if( i_last_pixel ) bs_write( s, 4, i_last_pixel );            else            {                bs_write( s, 4, 0 );                bs_write( s, 1, 1 );                bs_write( s, 1, 1 );                bs_write( s, 2, 0 ); /* pseudo color 0 */            }            i_length--;        }        if( i_length == 2 )        {            if( i_last_pixel )            {                bs_write( s, 4, i_last_pixel );                bs_write( s, 4, i_last_pixel );            }            else            {                bs_write( s, 4, 0 );                bs_write( s, 1, 1 );                bs_write( s, 1, 1 );                bs_write( s, 2, 1 ); /* 2 * pseudo color 0 */            }        }        else if( !i_last_pixel && i_length >= 3 && i_length <= 9 )        {            bs_write( s, 4, 0 );            bs_write( s, 1, 0 );            bs_write( s, 3, i_length - 2 ); /* (i_length - 2) * color 0 */        }        else if( i_length > 2 )        {            bs_write( s, 4, 0 );            bs_write( s, 1, 1 );            if( i_length <= 7 )            {                bs_write( s, 1, 0 );                bs_write( s, 2, i_length - 4 );                bs_write( s, 4, i_last_pixel );            }            else            {                bs_write( s, 1, 1 );                if( i_length <= 24 )                {                    bs_write( s, 2, 2 );                    bs_write( s, 4, i_length - 9 );                    bs_write( s, 4, i_last_pixel );                }                else                {                    bs_write( s, 2, 3 );                    bs_write( s, 8, i_length - 25 );                    bs_write( s, 4, i_last_pixel );                }            }        }        if( i == p_region->fmt.i_visible_width ) break;        i_last_pixel = p_data[i];        i_length = 1;    }    /* Stop */    bs_write( s, 8, 0 );    /* Stuffing */    bs_align_0( s );}static void encode_pixel_line_8bp( encoder_t *p_enc, bs_t *s,                                   subpicture_region_t *p_region,                                   int i_line ){    unsigned int i, i_length = 0;    int i_pitch = p_region->picture.p->i_pitch;    uint8_t *p_data = &p_region->picture.p->p_pixels[ i_pitch * i_line ];    int i_last_pixel = p_data[0];    for( i = 0; i <= p_region->fmt.i_visible_width; i++ )    {        if( i != p_region->fmt.i_visible_width &&            p_data[i] == i_last_pixel && i_length != 127 )        {            i_length++;            continue;        }        if( i_length == 1 && i_last_pixel )        {            /* 8bit/pixel code */            bs_write( s, 8, i_last_pixel );        }        else if( i_length == 2 && i_last_pixel )        {            /* 8bit/pixel code */            bs_write( s, 8, i_last_pixel );            bs_write( s, 8, i_last_pixel );        }        else if( i_length <= 127 )        {            bs_write( s, 8, 0 );            if( !i_last_pixel )            {                bs_write( s, 1, 0 );                bs_write( s, 7, i_length ); /* pseudo color 0 */            }            else            {                bs_write( s, 1, 1 );                bs_write( s, 7, i_length );                bs_write( s, 8, i_last_pixel );            }        }        if( i == p_region->fmt.i_visible_width ) break;        i_last_pixel = p_data[i];        i_length = 1;    }    /* Stop */    bs_write( s, 8, 0 );    bs_write( s, 8, 0 );    /* Stuffing */    bs_align_0( s );}

⌨️ 快捷键说明

复制代码 Ctrl + C
搜索代码 Ctrl + F
全屏模式 F11
切换主题 Ctrl + Shift + D
显示快捷键 ?
增大字号 Ctrl + =
减小字号 Ctrl + -