📄 lsr_enc.c
字号:
lsr_write_vluimsbf5(lsr, count, "count"); for (i=0; i<count; i++) { u8 *v = (u8 *)gf_list_get(l, i); lsr_write_vluimsbf5(lsr, *v, "val"); } } break; case 8: // floats { u32 i, count; if (svg_type==SVG_StrokeDashArray_datatype) { SVG_StrokeDashArray *da = (SVG_StrokeDashArray *)val; lsr_write_vluimsbf5(lsr, da->array.count, "count"); for (i=0; i<da->array.count; i++) { lsr_write_fixed_16_8(lsr, da->array.vals[i], "val"); } } else if (svg_type==SVG_ViewBox_datatype) { SVG_ViewBox *vb = (SVG_ViewBox *)val; lsr_write_vluimsbf5(lsr, 4, "count"); lsr_write_fixed_16_8(lsr, vb->x, "val"); lsr_write_fixed_16_8(lsr, vb->y, "val"); lsr_write_fixed_16_8(lsr, vb->width, "val"); lsr_write_fixed_16_8(lsr, vb->height, "val"); } else if (svg_type==SVG_Coordinates_datatype) { GF_List *l = *(GF_List **)val; count = gf_list_count(l); lsr_write_vluimsbf5(lsr, count, "count"); for (i=0; i<count; i++) { SVG_Coordinate *v = (SVG_Coordinate *)gf_list_get(l, i); lsr_write_fixed_16_8(lsr, v->value, "val"); } } else if (svg_type==SVG_Transform_Rotate_datatype) { Fixed angle; SVG_Point_Angle *p = (SVG_Point_Angle *)val; count = (p->x || p->y) ? 3 : 1; lsr_write_vluimsbf5(lsr, count, "count"); angle = gf_muldiv(p->angle, INT2FIX(180), GF_PI); lsr_write_fixed_16_8(lsr, p->angle, "val"); if (count==3) { lsr_write_fixed_16_8(lsr, p->x, "val"); lsr_write_fixed_16_8(lsr, p->y, "val"); } } else if (svg_type==SVG_Transform_Scale_datatype) { SVG_Point *pt = (SVG_Point *)val; count = (pt->x == pt->y) ? 1 : 2; lsr_write_vluimsbf5(lsr, count, "count"); lsr_write_fixed_16_8(lsr, pt->x, "val"); if (count==2) lsr_write_fixed_16_8(lsr, pt->y, "val"); } else { GF_List *l = *(GF_List **)val; count = gf_list_count(l); lsr_write_vluimsbf5(lsr, count, "count"); for (i=0; i<count; i++) { Fixed *v = (Fixed *)gf_list_get(l, i); lsr_write_fixed_16_8(lsr, *v, "val"); } } } break; case 9: // point if (svg_type==SVG_Motion_datatype) { lsr_write_coordinate(lsr, ((GF_Matrix2D*)val)->m[2], 0, "valX"); lsr_write_coordinate(lsr, ((GF_Matrix2D*)val)->m[5], 0, "valY"); } else { lsr_write_coordinate(lsr, ((SVG_Point *)val)->x, 0, "valX"); lsr_write_coordinate(lsr, ((SVG_Point *)val)->y, 0, "valY"); } break; default: lsr_write_extension(lsr, NULL, 0, name); break; }}static void lsr_write_anim_value(GF_LASeRCodec *lsr, SMIL_AnimateValue *val, const char *name){ if (!val || !val->type) { GF_LSR_WRITE_INT(lsr, 0, 1, name); } else { u32 type = svg_type_to_lsr_anim(val->type, 0, NULL, val->value); if (type==255) { GF_LOG(GF_LOG_WARNING, GF_LOG_CODING, ("[LASeR] unsupported anim type %d - skipping\n", val->type )); GF_LSR_WRITE_INT(lsr, 0, 1, name); } else { GF_LSR_WRITE_INT(lsr, 1, 1, name); GF_LSR_WRITE_INT(lsr, type, 4, "type"); lsr_write_an_anim_value(lsr, val->value, type, val->type, 0, name); } }}static void lsr_write_anim_values(GF_LASeRCodec *lsr, SMIL_AnimateValues *anims, const char *name){ u32 type, i, count = 0; if (anims && anims->type) count = gf_list_count(anims->values); if (!count) { GF_LSR_WRITE_INT(lsr, 0, 1, name); return; } type = svg_type_to_lsr_anim(anims->type, 0, anims->values, NULL); if (type==255) { GF_LOG(GF_LOG_WARNING, GF_LOG_CODING, ("[LASeR] unsupported anim type %d - skipping\n", anims->type )); GF_LSR_WRITE_INT(lsr, 0, 1, name); } else { GF_LSR_WRITE_INT(lsr, 1, 1, name); GF_LSR_WRITE_INT(lsr, type, 4, "type"); lsr_write_vluimsbf5(lsr, count, "count"); for (i=0; i<count; i++) { void *att = gf_list_get(anims->values, i); lsr_write_an_anim_value(lsr, att, type, anims->type, 0, "a_value"); } }}static void lsr_write_fraction_12(GF_LASeRCodec *lsr, GF_List **l, const char *name){ u32 i, count; count = l ? gf_list_count(*l) : 0; if (!count) { GF_LSR_WRITE_INT(lsr, 0, 1, name); return; } GF_LSR_WRITE_INT(lsr, 1, 1, name); lsr_write_vluimsbf5(lsr, count, "name"); for (i=0; i<count; i++) { Fixed f = * (Fixed *) gf_list_get(*l, i); if (!f || (f == FIX_ONE)) { GF_LSR_WRITE_INT(lsr, 1, 1, "hasShort"); GF_LSR_WRITE_INT(lsr, f ? 0 : 1, 1, "isZero"); } else { u32 ft = (u32) ( FIX2FLT(f) * 4096/*(1<<12)*/ ); GF_LSR_WRITE_INT(lsr, 0, 1, "hasShort"); GF_LSR_WRITE_INT(lsr, ft, 12, "val"); } }}static void lsr_write_float_list(GF_LASeRCodec *lsr, GF_List **l, const char *name){ u32 i, count = l ? gf_list_count(*l) : 0; if (!count) { GF_LSR_WRITE_INT(lsr, 0, 1, name); return; } GF_LSR_WRITE_INT(lsr, 1, 1, name); lsr_write_vluimsbf5(lsr, count, "count"); for (i=0;i<count;i++) { Fixed *v = (Fixed *)gf_list_get(*l, i); lsr_write_fixed_16_8(lsr, *v, "val"); }}static u32 lsr_get_bit_size(GF_LASeRCodec *lsr, Fixed v) { u32 val; v = gf_divfix(v, lsr->res_factor); val = (v<0) ? FIX2INT(-v) : FIX2INT(v); return 1 + gf_get_bit_size(val);}static void lsr_write_point_sequence(GF_LASeRCodec *lsr, GF_List **pts, const char *name){ u32 i, count = pts ? gf_list_count(*pts) : 0; lsr_write_vluimsbf5(lsr, count, "nbPoints"); if (!count) return; /*TODO golomb coding*/ GF_LSR_WRITE_INT(lsr, 0, 1, "flag"); if (1) { if (count < 3) { u32 nb_bits = 0; for (i=0; i<count; i++) { u32 k; SVG_Point *pt = (SVG_Point *)gf_list_get(*pts, i); k = lsr_get_bit_size(lsr, pt->x); if (k>nb_bits) nb_bits = k; k = lsr_get_bit_size(lsr, pt->y); if (k>nb_bits) nb_bits = k; } GF_LSR_WRITE_INT(lsr, nb_bits, 5, "bits"); for (i=0; i<count; i++) { SVG_Point *pt = (SVG_Point *)gf_list_get(*pts, i); u32 v = lsr_translate_coords(lsr, pt->x, nb_bits); GF_LSR_WRITE_INT(lsr, v, nb_bits, "x"); v = lsr_translate_coords(lsr, pt->y, nb_bits); GF_LSR_WRITE_INT(lsr, v, nb_bits, "y"); } } else { Fixed c_x, c_y; u32 k, nb_dx, nb_dy; SVG_Point *pt = (SVG_Point *)gf_list_get(*pts, 0); nb_dx = 0; k = lsr_get_bit_size(lsr, pt->x); if (k>nb_dx) nb_dx = k; k = lsr_get_bit_size(lsr, pt->y); if (k>nb_dx) nb_dx = k; GF_LSR_WRITE_INT(lsr, nb_dx, 5, "bits"); k = lsr_translate_coords(lsr, pt->x, nb_dx); GF_LSR_WRITE_INT(lsr, k, nb_dx, "x"); k = lsr_translate_coords(lsr, pt->y, nb_dx); GF_LSR_WRITE_INT(lsr, k, nb_dx, "y"); c_x = pt->x; c_y = pt->y; nb_dx = nb_dy = 0; for (i=1; i<count; i++) { SVG_Point *pt = (SVG_Point *)gf_list_get(*pts, i); k = lsr_get_bit_size(lsr, pt->x - c_x); if (k>nb_dx) nb_dx = k; k = lsr_get_bit_size(lsr, pt->y - c_y); if (k>nb_dy) nb_dy = k; c_x = pt->x; c_y = pt->y; } GF_LSR_WRITE_INT(lsr, nb_dx, 5, "bitsx"); GF_LSR_WRITE_INT(lsr, nb_dy, 5, "bitsy"); c_x = pt->x; c_y = pt->y; for (i=1; i<count; i++) { SVG_Point *pt = (SVG_Point *)gf_list_get(*pts, i); k = lsr_translate_coords(lsr, pt->x - c_x, nb_dx); GF_LSR_WRITE_INT(lsr, k, nb_dx, "dx"); k = lsr_translate_coords(lsr, pt->y - c_y, nb_dy); GF_LSR_WRITE_INT(lsr, k, nb_dy, "dy"); c_x = pt->x; c_y = pt->y; } } }}static void lsr_write_path_type(GF_LASeRCodec *lsr, SVG_PathData *path, const char *name){#if USE_GF_PATH u32 i, *contour, nb_types; GF_List *pts = gf_list_new(); contour = path->contours; nb_types = 0; for (i=0; i<path->n_points; ) { switch (path->tags[i]) { case GF_PATH_CURVE_ON: gf_list_add(pts, &path->points[i]); nb_types++; i++; break; case GF_PATH_CLOSE: nb_types++; i++; break; case GF_PATH_CURVE_CONIC: gf_list_add(pts, &path->points[i]); gf_list_add(pts, &path->points[i+1]); i+=2; nb_types++; break; case GF_PATH_CURVE_CUBIC: gf_list_add(pts, &path->points[i]); gf_list_add(pts, &path->points[i+1]); gf_list_add(pts, &path->points[i+2]); i+=3; nb_types++; break; } } lsr_write_point_sequence(lsr, &pts, "seq"); gf_list_del(pts); /*first moveTo is skiped*/ lsr_write_vluimsbf5(lsr, nb_types-1, "nbOfTypes"); for (i=0; i<path->n_points; ) { switch (path->tags[i]) { case GF_PATH_CLOSE: /*close*/ GF_LSR_WRITE_INT(lsr, LSR_PATH_COM_Z, 5, name); i++; break; case GF_PATH_CURVE_ON: if (!i) { } else if (*contour == i-1) { /*moveTo*/ GF_LSR_WRITE_INT(lsr, LSR_PATH_COM_M, 5, name); } else { /*lineTo*/ GF_LSR_WRITE_INT(lsr, LSR_PATH_COM_L, 5, name); } i++; break; case GF_PATH_CURVE_CONIC: /*Conic*/ GF_LSR_WRITE_INT(lsr, LSR_PATH_COM_Q, 5, name); i+=2; break; case GF_PATH_CURVE_CUBIC: /*cubic*/ GF_LSR_WRITE_INT(lsr, LSR_PATH_COM_C, 5, name); i+=3; break; } }#else u32 i, count; lsr_write_point_sequence(lsr, path->points, "seq"); /*initial move is not coded*/ count = gf_list_count(path->commands); lsr_write_vluimsbf5(lsr, count, "nbOfTypes"); for (i; i<count; i++) { u8 type = *(u8 *) gf_list_get(path->commands, i); GF_LSR_WRITE_INT(lsr, type, 5, name); }#endif}static void lsr_write_rotate_type(GF_LASeRCodec *lsr, SVG_Rotate *rotate, const char *name){ GF_LSR_WRITE_INT(lsr, rotate ? 1 : 0, 1, name); if (!rotate) return; if ((rotate->type == SVG_NUMBER_AUTO) || (rotate->type == SVG_NUMBER_AUTO_REVERSE)) { GF_LSR_WRITE_INT(lsr, 1, 1, "choice"); GF_LSR_WRITE_INT(lsr, (rotate->type == SVG_NUMBER_AUTO) ? 0 : 1, 1, "rotate"); } else { GF_LSR_WRITE_INT(lsr, 0, 1, "choice"); lsr_write_fixed_16_8(lsr, rotate->value, "rotate"); }}static void lsr_write_sync_behavior(GF_LASeRCodec *lsr, SMIL_SyncBehavior *sync, const char *name){ GF_LSR_WRITE_INT(lsr, sync ? 1 : 0, 1, name); if (!sync) return; assert(*sync!=SMIL_SYNCBEHAVIOR_INHERIT); GF_LSR_WRITE_INT(lsr, *sync-1, 2, name);}static void lsr_write_sync_tolerance(GF_LASeRCodec *lsr, SMIL_SyncTolerance *sync, const char *name){ GF_LSR_WRITE_INT(lsr, sync ? 1 : 0, 1, name); if (!sync) return; assert(sync->type!=SMIL_SYNCTOLERANCE_INHERIT); if (sync->type==SMIL_SYNCTOLERANCE_DEFAULT) { GF_LSR_WRITE_INT(lsr, 1, 1, name); } else { GF_LSR_WRITE_INT(lsr, 0, 1, name); lsr_write_vluimsbf5(lsr, (u32) (sync->value*lsr->time_resolution), "value"); }}static void lsr_write_coord_list(GF_LASeRCodec *lsr, GF_List **coords, const char *name){ u32 i, count = coords ? gf_list_count(*coords) : 0; if (!count) { GF_LSR_WRITE_INT(lsr, 0, 1, name); } else { GF_LSR_WRITE_INT(lsr, 1, 1, name); lsr_write_vluimsbf5(lsr, count, "nb_coords"); for (i=0; i<count; i++) { SVG_Coordinate *c = (SVG_Coordinate *)gf_list_get(*coords, i); u32 res = lsr_translate_coords(lsr, c->value, lsr->coord_bits); GF_LSR_WRITE_INT(lsr, res, lsr->coord_bits, name); } }}static void lsr_write_transform_behavior(GF_LASeRCodec *lsr, SVG_TransformBehavior *type){ GF_LSR_WRITE_INT(lsr, type ? 1 : 0, 1, "hasTransformBehavior"); if (!type) return; GF_LSR_WRITE_INT(lsr, *type, 4, "transformBehavior");}static void lsr_write_gradient_units(GF_LASeRCodec *lsr, SVG_GradientUnit *type){ GF_LSR_WRITE_INT(lsr, type ? 1 : 0, 1, "hasGradientUnits"); if (!type) return; GF_LSR_WRITE_INT(lsr, *type ? 1 : 0, 1, "gradientUnits");}static void lsr_write_content_type(GF_LASeRCodec *lsr, SVG_String *type, const char *name){ if (type) { GF_LSR_WRITE_INT(lsr, 1, 1, "hasType"); lsr_write_byte_align_string(lsr, *type, "type"); } else { GF_LSR_WRITE_INT(lsr, 0, 1, "hasType"); }}static void lsr_write_script_type(GF_LASeRCodec *lsr, SVG_String *type){ GF_LSR_WRITE_INT(lsr, type ? 1 : 0, 1, "hasType"); if (!type) return; if (!strcmp(*type, "application/ecmascript")) { GF_LSR_WRITE_INT(lsr, 1, 1, "choice"); GF_LSR_WRITE_INT(lsr, 0, 1, "script"); } else if (!strcmp(*type,
⌨️ 快捷键说明
复制代码
Ctrl + C
搜索代码
Ctrl + F
全屏模式
F11
切换主题
Ctrl + Shift + D
显示快捷键
?
增大字号
Ctrl + =
减小字号
Ctrl + -