当前位置: 首页 > 编程日记 > 正文

h.264 FMO

在H.264之前的标准中,比如H.263,其比特流中的数据是按照一个宏块接一个宏块的方式排列的,一旦发生丢包,很多相邻宏块信息都会丢失,很难进行错误隐藏处理。在H.264中加入了一项新特性:把宏块在比特流中的数据按照一定的映射规则进行排列,而不一定按照原本的光栅扫描顺序排列,这种方称为灵活的宏块重拍FMO(Flexible Macroblock Ordering)。

FMO是基于组的方式将宏块集合起来,把一帧内的宏块划分到不同的条带组(slice group)。当然在最后也需要对条带组按光栅扫描顺序划分条带(slice)。在h.264中,当slice group被设为大于1时才使用FMO。在代码端看来,FMO时,主要是对映射表(数组)的设置,如下第一个表:

对一帧进行FMO:

01201201201
12012012012
01201201201
12012012012
01201201201
12012012012
01201201201
12012012012
01201201201

得到slice group有三个:

000000000
000000000
000000000
00000
111111111
111111111
111111111
111111111
222222222
222222222
222222222
2222

然后再对每个slice group按照光栅扫描顺序进行排序,分割出slice,下面为分割slice group 0(假设slice长度为16)

slice 1 in slice group 0:

0123456789101112131415

slice 2 in slice group 0:

16171819202122232425262728293031

FMO在h.264中有7种(FMO0 ~ FMO6)

FMO0

FMO0,交织映射。交织映射是指不同的slice group交替出现。

如下设置了slice group 0 = 10,slice group 1 = 15,slice group 2 = 18

00000000001
11111111111
11122222222
22222222220
00000000011
11111111111
11222222222
22222222200
00000000111

JM code如下:

1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
24
25
26
27
/*!
 ************************************************************************
 * \brief
 *    Generate interleaved slice group map type MapUnit map (type 0)
 *
 * \param img
 *    Image Parameter to be used for map generation
 * \param pps
 *    Picture Parameter set to be used for map generation
 ************************************************************************
 */
static void FmoGenerateType0MapUnitMap (ImageParameters * img, pic_parameter_set_rbsp_t * pps )
{
  unsigned iGroup, j;
  unsigned i = 0;
  do
  {
    for( iGroup = 0;
    (iGroup <= pps->num_slice_groups_minus1) && (i < PicSizeInMapUnits);
    i += pps->run_length_minus1[iGroup++] + 1)
    {
      for( j = 0; j <= pps->run_length_minus1[ iGroup ] && i + j < PicSizeInMapUnits; j++ )
        MapUnitToSliceGroupMap[i+j] = iGroup;
    }
  }
  while( i < PicSizeInMapUnits );
}

FMO1

FMO1,分散映射。每个宏块相邻的宏块都不在同一组。x方向上的宏块按照slice group序号递增分配,y方向第一个宏块按照0,slice group numbers/2交替分配。

01201201201
12012012012
01201201201
12012012012
01201201201
12012012012
01201201201
12012012012
01201201201

JM code 如下:

1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
/*!
 ************************************************************************
 * \brief
 *    Generate dispersed slice group map type MapUnit map (type 1)
 *
 * \param img
 *    Image Parameter to be used for map generation
 * \param pps
 *    Picture Parameter set to be used for map generation
 ************************************************************************
 */
static void FmoGenerateType1MapUnitMap (ImageParameters * img, pic_parameter_set_rbsp_t * pps )
{
  unsigned i;
  for( i = 0; i < PicSizeInMapUnits; i++ )
  {
    MapUnitToSliceGroupMap[i] = ((i%img->PicWidthInMbs)+(((i/img->PicWidthInMbs)*(pps->num_slice_groups_minus1+1))/2))
      %(pps->num_slice_groups_minus1+1);
  }
}

FMO2

FMO2,前后景映射。以整个帧作为背景,该模式可以通过(左上角坐标,右下角坐标)的方式指定前景,每个前景都为一个slice group,最先指定的前景可以覆盖后来指定的前景。

假设有

slice group 0(3,4)(8,8)

slice group 1(1,2)(6,6)

22222222222
22222222222
21111112222
21111112222
21100000022
21100000022
21100000022
22200000022
22200000022

JM code如下:

1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
24
25
26
27
28
29
30
31
/*!
 ************************************************************************
 * \brief
 *    Generate foreground with left-over slice group map type MapUnit map (type 2)
 *
 * \param img
 *    Image Parameter to be used for map generation
 * \param pps
 *    Picture Parameter set to be used for map generation
 ************************************************************************
 */
static void FmoGenerateType2MapUnitMap (ImageParameters * img, pic_parameter_set_rbsp_t * pps )
{
  int iGroup;
  unsigned i, x, y;
  unsigned yTopLeft, xTopLeft, yBottomRight, xBottomRight;
  
  for( i = 0; i < PicSizeInMapUnits; i++ )
    MapUnitToSliceGroupMap[ i ] = pps->num_slice_groups_minus1;
  
  for( iGroup = pps->num_slice_groups_minus1 - 1 ; iGroup >= 0; iGroup-- )
  {
    yTopLeft = pps->top_left[ iGroup ] / img->PicWidthInMbs;
    xTopLeft = pps->top_left[ iGroup ] % img->PicWidthInMbs;
    yBottomRight = pps->bottom_right[ iGroup ] / img->PicWidthInMbs;
    xBottomRight = pps->bottom_right[ iGroup ] % img->PicWidthInMbs;
    for( y = yTopLeft; y <= yBottomRight; y++ )
      for( x = xTopLeft; x <= xBottomRight; x++ )
        MapUnitToSliceGroupMap[ y * img->PicWidthInMbs + x ] = iGroup;
  }
}

FMO3

FMO3,环形扫描映射。在JM中,环形扫描映射把一帧分为两个slice group,一个是以一帧为背景,另一个是以环作为的前景(其实环可以扩展到更多的group)。环的起点是帧的中心位置,通过指定环的运动方向(顺时针或逆时针)以及环的长度即可得到前景。

以下为顺时针,环长度为32

11111111111
11111111111
11120212223242511
1111967892611
11118501102711
11117432112811
11116151413122911
1111111313011
11111111111

JM code 如下:

1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
24
25
26
27
28
29
30
31
32
33
34
35
36
37
38
39
40
41
42
43
44
45
46
47
48
49
50
51
52
53
54
55
56
57
58
59
60
61
62
63
64
65
66
67
68
69
70
71
72
73
74
75
76
77
78
79
/*!
 ************************************************************************
 * \brief
 *    Generate box-out slice group map type MapUnit map (type 3)
 *
 * \param img
 *    Image Parameter to be used for map generation
 * \param pps
 *    Picture Parameter set to be used for map generation
 ************************************************************************
 */
static void FmoGenerateType3MapUnitMap (ImageParameters * img, pic_parameter_set_rbsp_t * pps )
{
  unsigned i, k;
  int leftBound, topBound, rightBound, bottomBound;
  int x, y, xDir, yDir;
  int mapUnitVacant;
  
  unsigned mapUnitsInSliceGroup0 = min((pps->slice_group_change_rate_minus1 + 1) * img->slice_group_change_cycle, PicSizeInMapUnits);
  
  for( i = 0; i < PicSizeInMapUnits; i++ )
    MapUnitToSliceGroupMap[ i ] = 2;
  
  x = ( img->PicWidthInMbs - pps->slice_group_change_direction_flag ) / 2;
  y = ( img->PicHeightInMapUnits - pps->slice_group_change_direction_flag ) / 2;
  
  leftBound   = x;
  topBound    = y;
  rightBound  = x;
  bottomBound = y;
  
  xDir =  pps->slice_group_change_direction_flag - 1;
  yDir =  pps->slice_group_change_direction_flag;
  
  for( k = 0; k < PicSizeInMapUnits; k += mapUnitVacant )
  {
    mapUnitVacant = ( MapUnitToSliceGroupMap[ y * img->PicWidthInMbs + x ]  ==  2 );
    if( mapUnitVacant )
      MapUnitToSliceGroupMap[ y * img->PicWidthInMbs + x ] = ( k >= mapUnitsInSliceGroup0 );
    
    if( xDir  ==  -1  &&  x  ==  leftBound )
    {
      leftBound = max( leftBound - 1, 0 );
      x = leftBound;
      xDir = 0;
      yDir = 2 * pps->slice_group_change_direction_flag - 1;
    }
    else
      if( xDir  ==  1  &&  x  ==  rightBound )
      {
        rightBound = min( rightBound + 1, (int)img->PicWidthInMbs - 1 );
        x = rightBound;
        xDir = 0;
        yDir = 1 - 2 * pps->slice_group_change_direction_flag;
      }
      else
        if( yDir  ==  -1  &&  y  ==  topBound )
        {
          topBound = max( topBound - 1, 0 );
          y = topBound;
          xDir = 1 - 2 * pps->slice_group_change_direction_flag;
          yDir = 0;
        }
        else
          if( yDir  ==  1  &&  y  ==  bottomBound )
          {
            bottomBound = min( bottomBound + 1, (int)img->PicHeightInMapUnits - 1 );
            y = bottomBound;
            xDir = 2 * pps->slice_group_change_direction_flag - 1;
            yDir = 0;
          }
          else
          {
            x = x + xDir;
            y = y + yDir;
          }
  }
  
}

FMO4

FMO4,光栅扫描映射。该模式只支持两个slice group,按照光栅扫描顺序来分组,方向有正向与反向之分。

如下为反向FMO4(始于右下角):

11111111111
11111111111
11111111111
11111000000
00000000000
00000000000
00000000000
00000000000
00000000000

JM code 如下:

1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
24
25
26
/*!
 ************************************************************************
 * \brief
 *    Generate raster scan slice group map type MapUnit map (type 4)
 *
 * \param img
 *    Image Parameter to be used for map generation
 * \param pps
 *    Picture Parameter set to be used for map generation
 ************************************************************************
 */
static void FmoGenerateType4MapUnitMap (ImageParameters * img, pic_parameter_set_rbsp_t * pps )
{
  
  unsigned mapUnitsInSliceGroup0 = min((pps->slice_group_change_rate_minus1 + 1) * img->slice_group_change_cycle, PicSizeInMapUnits);
  unsigned sizeOfUpperLeftGroup = pps->slice_group_change_direction_flag ? ( PicSizeInMapUnits - mapUnitsInSliceGroup0 ) : mapUnitsInSliceGroup0;
  
  unsigned i;
  
  for( i = 0; i < PicSizeInMapUnits; i++ )
    if( i < sizeOfUpperLeftGroup )
      MapUnitToSliceGroupMap[ i ] = pps->slice_group_change_direction_flag;
    else
      MapUnitToSliceGroupMap[ i ] = 1 - pps->slice_group_change_direction_flag;
    
}

FMO5

FMO5,擦式扫描映射。仅支持两个slice group,扫描方式为纵向,也有正反两个方向

如下为正向FMO5(始于左上角):

00011111111
00011111111
00111111111
00111111111
00111111111
00111111111
00111111111
00111111111
00111111111

JM code 如下:

1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
24
25
26
27
/*!
 ************************************************************************
 * \brief
 *    Generate wipe slice group map type MapUnit map (type 5)
 *
 * \param img
 *    Image Parameter to be used for map generation
 * \param pps
 *    Picture Parameter set to be used for map generation
 ************************************************************************
*/
static void FmoGenerateType5MapUnitMap (ImageParameters * img, pic_parameter_set_rbsp_t * pps )
{
  
  unsigned mapUnitsInSliceGroup0 = min((pps->slice_group_change_rate_minus1 + 1) * img->slice_group_change_cycle, PicSizeInMapUnits);
  unsigned sizeOfUpperLeftGroup = pps->slice_group_change_direction_flag ? ( PicSizeInMapUnits - mapUnitsInSliceGroup0 ) : mapUnitsInSliceGroup0;
  
  unsigned i,j, k = 0;
  
  for( j = 0; j < img->PicWidthInMbs; j++ )
    for( i = 0; i < img->PicHeightInMapUnits; i++ )
      if( k++ < sizeOfUpperLeftGroup )
        MapUnitToSliceGroupMap[ i * img->PicWidthInMbs + j ] = 1 - pps->slice_group_change_direction_flag;
      else
        MapUnitToSliceGroupMap[ i * img->PicWidthInMbs + j ] = pps->slice_group_change_direction_flag;
      
}

FMO6

FMO6,显示控制映射。可以在配置文件中自由地指定每个宏块所属的slice group。

01021102111
12000102010
35410035401
00553102501
41001111442
02232321523
01201120555
32141440332
42350014123

顺带一提JM支持一帧中最多为8个slice group

JM code 如下:

1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
/*!
 ************************************************************************
 * \brief
 *    Generate explicit slice group map type MapUnit map (type 6)
 *
 * \param img
 *    Image Parameter to be used for map generation
 * \param pps
 *    Picture Parameter set to be used for map generation
 ************************************************************************
 */
static void FmoGenerateType6MapUnitMap (ImageParameters * img, pic_parameter_set_rbsp_t * pps )
{
  unsigned i;
  for (i=0; i<PicSizeInMapUnits; i++)
  {
    MapUnitToSliceGroupMap[i] = pps->slice_group_id[i];
  }
}

 

转载于:https://www.cnblogs.com/xumaojun/p/8523516.html

相关文章:

lvs+keepalived+nginx+tomcat

# 拓扑如下所示 # 节点分布情况 LVS-dr-master eth0: 192.168.146.141 LVS-dr-slave eth0: 192.168.146.142 nginx1: eth0: 192.168.146.139 nginx2: eth0: 192.168.146.140 tomcat1: eth0: 192.168.146.138 启用了4个tomcat VIP: 192.168.146.200 # 具体配置 ### lvs master #…

iOS 关于pods-frameworks.sh:permission denied报错的解决

最近公司新开项目&#xff0c;搭建完框架后小伙伴拉取代码后build一直报错&#xff1a;pods-frameworks.sh:permission denied 查了很多博文后找到了如下解决方案&#xff0c;在此记录。 打开终端输入如下命令行回车即可&#xff1a; chmod ax "/Users/xxx/Pods/Pods-re…

区块链分布式账本

链客&#xff0c;专为开发者而生&#xff0c;有问必答&#xff01; 此文章来自区块链技术社区&#xff0c;未经允许拒绝转载。 账本是具有一定格式和许多账页组成的&#xff0c;以会计凭证为基础&#xff0c;对经济业务进行序时分类记录&#xff0c;也就是所说的账册。 账本在…

jmeter实现多并发

1.jmeter实现多并发 线程组:负载发生器,用以多线程或多进程的方式来模拟用户的使用行为.jmeter是以线程的方式来进行模拟用户的并发访问的 转载于:https://www.cnblogs.com/xuzhongtao/p/8526502.html

循环语句——7月23日

循环语句&#xff1a;for 格式&#xff1a; for (int i 1/*初始条件*/; i < 100/* 循环条件*/; i /*状态改变*/) { //循环体&#xff0c;执行代码&#xff1b;(break;跳出循环体) } 给出初始条件&#xff0c;先判断是否满足循环条件&#xff0c;如果不满足条件则跳过for语句…

CocoaPods私有库搭建的记录

前言 随着项目的业务增加以及马甲包进度的跟进&#xff0c;一些重复的独立业务以私有库的方式引入到项目中对于项目进度的开发就显得越发的迫切了&#xff0c;本文主要记录自己搭建私有库时的整个流程&#xff0c;以防后面再次搭建时忘记&#xff0c;方便自己查阅。 整个记录…

区块链笔记-Hash算法

链客&#xff0c;专为开发者而生&#xff0c;有问必答&#xff01; 此文章来自区块链技术社区&#xff0c;未经允许拒绝转载。 区块链笔记-Hash算法 区块链技术是一系列技术的结合&#xff0c;建立新的技术架构&#xff0c;hash算法是很重要的一块&#xff0c;如果理解不当的…

Thrift源码解析--TBinaryProtocol

本文为原创:http://www.cnblogs.com/leehfly/p/4958206.html&#xff0c;未经许可禁止转载。 关于Tprotocol层都是一些通信协议&#xff0c;个人感觉内容较大&#xff0c;很难分类描述清楚。故打算以TBinaryProtocol为例&#xff0c;分析客户端发请求以及接收服务端返回数据的整…

一篇价值百万的文章:我为什么在22岁辞去年薪150万的工作?

本文转载自http://www.cricode.com/4208.html 作者&#xff1a;奶牛Denny 今天是22岁的最后一天。几个月前&#xff0c;我从沃顿商学院毕业&#xff0c;用文凭上“最高荣誉毕业”的标签安抚了已经年过半百的老妈&#xff0c;然后转头辞去了毕业后的第一份工作&#xff0c;跟一…

电脑温度检测软件哪个好_一般电脑录音软件哪个好?

随着科技的快速发展&#xff0c;为了满足各行各业的音频录制需求&#xff0c;电脑版录音软件也在陆续不断的出现在各大应用市场&#xff0c;与传统的自带音频录制工具相比&#xff0c;电脑版录音软件更加专注的是电脑上的音频录制&#xff0c;它能够将发生在电脑上的一切声音源…

区块链的隐私性

链客&#xff0c;专为开发者而生&#xff0c;有问必答&#xff01; 此文章来自区块链技术社区&#xff0c;未经允许拒绝转载。 我最近看区块链简单介绍的时候会发现有的人就说其有良好的隐私性&#xff0c;但也有人说保护隐私性上有缺陷&#xff0c;今天就简单的对区块链的隐私…

ssh免密连接远程服务器

ssh免密连接远程服务器 借助ssky-keygen和ssh-copy-id工具&#xff0c;通过4个简单的步骤实现无需输入密码登录远程Linux主机 1 生成密钥 通过内置的工具生成RSA算法加密的密钥 ssh-keygen -t rsa 回车默认选项即可&#xff0c;会在当前用户的home文件下生成密钥文件 2 拷贝密钥…

什么是互联网大厂_仅限今天!大厂最热数据分析经典实战项目大公开!

原标题&#xff1a;仅限今天&#xff01;大厂最热数据分析经典实战项目大公开&#xff01;如今&#xff0c;全球早已步入数据时代&#xff0c;随着行业的高速发展&#xff0c;相关岗位缺口已超150万&#xff0c;且薪资超同行业50%。未来十年&#xff0c;数据细分岗位将扩张5倍&…

php教学视频

http://www.52pojie.cn/forum.php?modviewthread&tid283589转载于:https://www.cnblogs.com/dawanxiaobao/p/5703157.html

Go基础编程:作用域

链客&#xff0c;专为开发者而生&#xff0c;有问必答&#xff01; 此文章来自区块链技术社区&#xff0c;未经允许拒绝转载。 Go基础编程&#xff1a;作用域11 小弟初学go语言&#xff0c;感觉作用域的运用还是很广泛的&#xff0c;所以就写上一点&#xff0c;也许有的都是很…

数据分析之CE找数据大法

一&#xff0e;基本介绍 CE的全称为Cheat Engine&#xff0c;是一款内存修改编辑工具&#xff0c;其官网是http://www.cheatengine.org&#xff0c;可以在其官网下载到最新的CE工具&#xff0c;目前最新版本是Cheat Engine6.5。CE同时也是一款开源的工具&#xff0c;使用者可以…

a++浏览器_“公司发给我的职业装太小了,我该怎么和领导说?”哈哈哈哈哈|职业装|uc|浏览器...

GIF打开UC浏览器 查看更多精彩图片GIF打开UC浏览器 查看更多精彩图片GIF打开UC浏览器 查看更多精彩图片GIF打开UC浏览器 查看更多精彩图片GIF打开UC浏览器 查看更多精彩图片GIF打开UC浏览器 查看更多精彩图片GIF打开UC浏览器 查看更多精彩图片打开UC浏览器 查看更多精彩图片GIF…

Go基础编程:延迟调用defer

链客&#xff0c;专为开发者而生&#xff0c;有问必答&#xff01; 此文章来自区块链技术社区&#xff0c;未经允许拒绝转载。 本篇文章所讲的就是go编程中的延迟调用defer&#xff0c;希望对社区的成员有较多的帮助。 1 defer作用 关键字defer ⽤于延迟一个函数、方法或者当…

maven工程插件配置

1 <build>2 <!-- 该级工程会加载插件&#xff0c;放在父工程里 -->3 <plugins>4 <!-- 资源文件拷贝插件 -->5 <plugin>6 <groupId>org.apache.maven.plugins</groupId>7 …

卡巴斯基安全浏览器_卡巴斯基 for windows 全方位安全软件2021注册表清除版

软件介绍最近从来不相信木马的Run同学中招了&#xff0c;wup.exe(俗称矿机木马)&#xff0c;此款木马真可谓厉害&#xff0c;无敌&#xff0c;用过所有方法都无法清理&#xff0c;百度了所有的道道几乎无用&#xff0c;中了此毒&#xff0c;电脑不会有什么特别异常&#xff0c;…

Android通过ksoap2调用.net(c#)的webservice

转载于:https://www.cnblogs.com/Nagisa-Saku/p/5706183.html

●洛谷P3688 [ZJOI2017]树状数组

题链&#xff1a; https://www.luogu.org/problemnew/show/P3688题解&#xff1a; 二维线段树。 先不看询问时l1的特殊情况。 对于一个询问(l,r)&#xff0c;如果要让错误的程序得到正确答案&#xff0c; 显然应该满足l-1位置的值r位置的值&#xff08;或者说两个位置的异或值…

Activity-生命周期

Activity不是什么陌生的东西&#xff0c;作为Android程序媛对Activity再熟悉不过。每当说起Activity总最关注的还是它的生命周期。 1、一张来自谷歌官方文档的Activity的生命周期图&#xff1a; 直接来个MainActivity覆盖上面所有的方法通过log打印方式给大家展现&#xff0c;通…

arial unicode ms字体_5个检测商用字体和免费字体合集的网站

对于做新媒体和设计的小伙伴来说&#xff0c;最恐慌的就是加班、改稿、脱发、没钱...侵权问题了。一个不注意就是律师函警告。正所谓律师函不是不到&#xff0c;只是晚到。所以&#xff0c;皮皮特意为小伙伴们搜集了这5个远离字体侵权的网站&#xff0c;有检测字体版权的&#…

DAPP是什么

链客&#xff0c;专为开发者而生&#xff0c;有问必答&#xff01; 此文章来自区块链技术社区&#xff0c;未经允许拒绝转载。 1 DAPP是什么1 当满足下所有条件的时候&#xff0c;一个应用才可以称为DAPP [if !supportLists]1. [endif]必须是开源、自治并没有一个实体控制着…

JVM学习--(一)基本原理

前言 JVM一直是java知识里面进阶阶段的重要部分&#xff0c;如果希望在java领域研究的更深入&#xff0c;则JVM则是如论如何也避开不了的话题&#xff0c;本系列试图通过简洁易读的方式&#xff0c;讲解JVM必要的知识点。 运行流程 我们都知道java一直宣传的口号是&#xff1a;…

phpexcel导出超过26列解决方案

phpexcel导出超过26列解决方案 原文:phpexcel导出超过26列解决方案 将列的数字序号转成字母使用,代码如下: PHPExcel_Cell::stringFromColumnIndex($i); // 从o,1,2,3,..开始,相应返回返回 A,B,C,...Z,AA,AB,...将列的字母转成数字序号使用,代码如下: PHPExcel_Cell::columnIn…

h5大转盘抽奖源码后台_微信H5互动营销应该要如何做?

现在微信营销的队伍有越来越多的人群&#xff0c;许多的企业品牌都会选择用微信营销&#xff0c;而微信营销这么受欢迎是因为微信拉近了用户与企业品牌的关系。其中H5互动营销是最受欢迎的一种方式&#xff0c;那么微信H5互动营销要如何做呢&#xff1f;企业想要在微信H5营销中…

Solidity语言

链客&#xff0c;专为开发者而生&#xff0c;有问必答&#xff01; 此文章来自区块链技术社区&#xff0c;未经允许拒绝转载。 Solidity语言11 Solidity是以太坊智能合约的编程语言&#xff0c;我自己也是学习了很久&#xff0c;感觉是有些难度&#xff0c;所以需要去认真的去…

同一个类 cannot be cast to_留学热门assignment之 税收筹划类essay

税法和税务筹划一直以来都是热门的行业&#xff0c;由于近些年对于税务人才的需求越来越大&#xff0c;税法专业成为了当下最火爆的留学专业之一。发达国家由于税收和法律体系相对完善&#xff0c;法律的条文相较于其他国家而言也更加的细致和有操作性&#xff0c;因此&#xf…