📄 dvbsub.c
字号:
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 + -