Skip to content
Projects
Groups
Snippets
Help
Loading...
Help
Contribute to GitLab
Sign in / Register
Toggle navigation
F
ffmpeg.wasm-core
Project
Project
Details
Activity
Cycle Analytics
Repository
Repository
Files
Commits
Branches
Tags
Contributors
Graph
Compare
Charts
Issues
0
Issues
0
List
Board
Labels
Milestones
Merge Requests
0
Merge Requests
0
CI / CD
CI / CD
Pipelines
Jobs
Schedules
Charts
Wiki
Wiki
Snippets
Snippets
Members
Members
Collapse sidebar
Close sidebar
Activity
Graph
Charts
Create a new issue
Jobs
Commits
Issue Boards
Open sidebar
Linshizhi
ffmpeg.wasm-core
Commits
520c1ec6
Commit
520c1ec6
authored
Apr 18, 2012
by
Diego Biurrun
Browse files
Options
Browse Files
Download
Email Patches
Plain Diff
dv: Split profile handling code into a separate file.
parent
0a3ad7ff
Hide whitespace changes
Inline
Side-by-side
Showing
7 changed files
with
410 additions
and
356 deletions
+410
-356
Makefile
libavcodec/Makefile
+4
-4
dv_profile.c
libavcodec/dv_profile.c
+331
-0
dv_profile.h
libavcodec/dv_profile.h
+72
-0
dvdata.c
libavcodec/dvdata.c
+0
-307
dvdata.h
libavcodec/dvdata.h
+1
-45
dv.c
libavformat/dv.c
+1
-0
dvenc.c
libavformat/dvenc.c
+1
-0
No files found.
libavcodec/Makefile
View file @
520c1ec6
...
...
@@ -133,8 +133,8 @@ OBJS-$(CONFIG_DVBSUB_DECODER) += dvbsubdec.o
OBJS-$(CONFIG_DVBSUB_ENCODER)
+=
dvbsub.o
OBJS-$(CONFIG_DVDSUB_DECODER)
+=
dvdsubdec.o
OBJS-$(CONFIG_DVDSUB_ENCODER)
+=
dvdsubenc.o
OBJS-$(CONFIG_DVVIDEO_DECODER)
+=
dvdec.o
dv.o
dvdata.o
OBJS-$(CONFIG_DVVIDEO_ENCODER)
+=
dv.o
dvdata.o
OBJS-$(CONFIG_DVVIDEO_DECODER)
+=
dvdec.o
dv.o
dvdata.o
dv_profile.o
OBJS-$(CONFIG_DVVIDEO_ENCODER)
+=
dv.o
dvdata.o
dv_profile.o
OBJS-$(CONFIG_DXA_DECODER)
+=
dxa.o
OBJS-$(CONFIG_DXTORY_DECODER)
+=
dxtory.o
OBJS-$(CONFIG_EAC3_DECODER)
+=
eac3dec.o
eac3_data.o
...
...
@@ -558,8 +558,8 @@ OBJS-$(CONFIG_ADPCM_YAMAHA_ENCODER) += adpcmenc.o adpcm_data.o
OBJS-$(CONFIG_ADTS_MUXER)
+=
mpeg4audio.o
OBJS-$(CONFIG_ADX_DEMUXER)
+=
adx.o
OBJS-$(CONFIG_CAF_DEMUXER)
+=
mpeg4audio.o
mpegaudiodata.o
OBJS-$(CONFIG_DV_DEMUXER)
+=
dv
data
.o
OBJS-$(CONFIG_DV_MUXER)
+=
dv
data
.o
OBJS-$(CONFIG_DV_DEMUXER)
+=
dv
_profile
.o
OBJS-$(CONFIG_DV_MUXER)
+=
dv
_profile
.o
OBJS-$(CONFIG_FLAC_DEMUXER)
+=
flacdec.o
flacdata.o
flac.o
OBJS-$(CONFIG_FLAC_MUXER)
+=
flacdec.o
flacdata.o
flac.o
OBJS-$(CONFIG_FLV_DEMUXER)
+=
mpeg4audio.o
...
...
libavcodec/dv_profile.c
0 → 100644
View file @
520c1ec6
/*
* This file is part of Libav.
*
* Libav is free software; you can redistribute it and/or
* modify it under the terms of the GNU Lesser General Public
* License as published by the Free Software Foundation; either
* version 2.1 of the License, or (at your option) any later version.
*
* Libav is distributed in the hope that it will be useful,
* but WITHOUT ANY WARRANTY; without even the implied warranty of
* MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the GNU
* Lesser General Public License for more details.
*
* You should have received a copy of the GNU Lesser General Public
* License along with Libav; if not, write to the Free Software
* Foundation, Inc., 51 Franklin Street, Fifth Floor, Boston, MA 02110-1301 USA
*/
#include <stdint.h>
#include "libavutil/log.h"
#include "libavutil/pixdesc.h"
#include "avcodec.h"
#include "dv_profile.h"
static
DVwork_chunk
work_chunks_dv25pal
[
1
*
12
*
27
];
static
DVwork_chunk
work_chunks_dv25pal411
[
1
*
12
*
27
];
static
DVwork_chunk
work_chunks_dv25ntsc
[
1
*
10
*
27
];
static
DVwork_chunk
work_chunks_dv50pal
[
2
*
12
*
27
];
static
DVwork_chunk
work_chunks_dv50ntsc
[
2
*
10
*
27
];
static
DVwork_chunk
work_chunks_dv100palp
[
2
*
12
*
27
];
static
DVwork_chunk
work_chunks_dv100ntscp
[
2
*
10
*
27
];
static
DVwork_chunk
work_chunks_dv100pali
[
4
*
12
*
27
];
static
DVwork_chunk
work_chunks_dv100ntsci
[
4
*
10
*
27
];
static
uint32_t
dv_idct_factor_sd
[
2
*
2
*
22
*
64
];
static
uint32_t
dv_idct_factor_hd1080
[
2
*
4
*
16
*
64
];
static
uint32_t
dv_idct_factor_hd720
[
2
*
4
*
16
*
64
];
static
const
uint8_t
dv_audio_shuffle525
[
10
][
9
]
=
{
{
0
,
30
,
60
,
20
,
50
,
80
,
10
,
40
,
70
},
/* 1st channel */
{
6
,
36
,
66
,
26
,
56
,
86
,
16
,
46
,
76
},
{
12
,
42
,
72
,
2
,
32
,
62
,
22
,
52
,
82
},
{
18
,
48
,
78
,
8
,
38
,
68
,
28
,
58
,
88
},
{
24
,
54
,
84
,
14
,
44
,
74
,
4
,
34
,
64
},
{
1
,
31
,
61
,
21
,
51
,
81
,
11
,
41
,
71
},
/* 2nd channel */
{
7
,
37
,
67
,
27
,
57
,
87
,
17
,
47
,
77
},
{
13
,
43
,
73
,
3
,
33
,
63
,
23
,
53
,
83
},
{
19
,
49
,
79
,
9
,
39
,
69
,
29
,
59
,
89
},
{
25
,
55
,
85
,
15
,
45
,
75
,
5
,
35
,
65
},
};
static
const
uint8_t
dv_audio_shuffle625
[
12
][
9
]
=
{
{
0
,
36
,
72
,
26
,
62
,
98
,
16
,
52
,
88
},
/* 1st channel */
{
6
,
42
,
78
,
32
,
68
,
104
,
22
,
58
,
94
},
{
12
,
48
,
84
,
2
,
38
,
74
,
28
,
64
,
100
},
{
18
,
54
,
90
,
8
,
44
,
80
,
34
,
70
,
106
},
{
24
,
60
,
96
,
14
,
50
,
86
,
4
,
40
,
76
},
{
30
,
66
,
102
,
20
,
56
,
92
,
10
,
46
,
82
},
{
1
,
37
,
73
,
27
,
63
,
99
,
17
,
53
,
89
},
/* 2nd channel */
{
7
,
43
,
79
,
33
,
69
,
105
,
23
,
59
,
95
},
{
13
,
49
,
85
,
3
,
39
,
75
,
29
,
65
,
101
},
{
19
,
55
,
91
,
9
,
45
,
81
,
35
,
71
,
107
},
{
25
,
61
,
97
,
15
,
51
,
87
,
5
,
41
,
77
},
{
31
,
67
,
103
,
21
,
57
,
93
,
11
,
47
,
83
},
};
/* macroblock bit budgets */
static
const
uint8_t
block_sizes_dv2550
[
8
]
=
{
112
,
112
,
112
,
112
,
80
,
80
,
0
,
0
,
};
static
const
uint8_t
block_sizes_dv100
[
8
]
=
{
80
,
80
,
80
,
80
,
80
,
80
,
64
,
64
,
};
static
const
DVprofile
dv_profiles
[]
=
{
{
.
dsf
=
0
,
.
video_stype
=
0x0
,
.
frame_size
=
120000
,
/* IEC 61834, SMPTE-314M - 525/60 (NTSC) */
.
difseg_size
=
10
,
.
n_difchan
=
1
,
.
time_base
=
{
1001
,
30000
},
.
ltc_divisor
=
30
,
.
height
=
480
,
.
width
=
720
,
.
sar
=
{{
8
,
9
},
{
32
,
27
}},
.
work_chunks
=
&
work_chunks_dv25ntsc
[
0
],
.
idct_factor
=
&
dv_idct_factor_sd
[
0
],
.
pix_fmt
=
PIX_FMT_YUV411P
,
.
bpm
=
6
,
.
block_sizes
=
block_sizes_dv2550
,
.
audio_stride
=
90
,
.
audio_min_samples
=
{
1580
,
1452
,
1053
},
/* for 48, 44.1 and 32kHz */
.
audio_samples_dist
=
{
1600
,
1602
,
1602
,
1602
,
1602
},
/* per SMPTE-314M */
.
audio_shuffle
=
dv_audio_shuffle525
,
},
{
.
dsf
=
1
,
.
video_stype
=
0x0
,
.
frame_size
=
144000
,
/* IEC 61834 - 625/50 (PAL) */
.
difseg_size
=
12
,
.
n_difchan
=
1
,
.
time_base
=
{
1
,
25
},
.
ltc_divisor
=
25
,
.
height
=
576
,
.
width
=
720
,
.
sar
=
{{
16
,
15
},
{
64
,
45
}},
.
work_chunks
=
&
work_chunks_dv25pal
[
0
],
.
idct_factor
=
&
dv_idct_factor_sd
[
0
],
.
pix_fmt
=
PIX_FMT_YUV420P
,
.
bpm
=
6
,
.
block_sizes
=
block_sizes_dv2550
,
.
audio_stride
=
108
,
.
audio_min_samples
=
{
1896
,
1742
,
1264
},
/* for 48, 44.1 and 32kHz */
.
audio_samples_dist
=
{
1920
,
1920
,
1920
,
1920
,
1920
},
.
audio_shuffle
=
dv_audio_shuffle625
,
},
{
.
dsf
=
1
,
.
video_stype
=
0x0
,
.
frame_size
=
144000
,
/* SMPTE-314M - 625/50 (PAL) */
.
difseg_size
=
12
,
.
n_difchan
=
1
,
.
time_base
=
{
1
,
25
},
.
ltc_divisor
=
25
,
.
height
=
576
,
.
width
=
720
,
.
sar
=
{{
16
,
15
},
{
64
,
45
}},
.
work_chunks
=
&
work_chunks_dv25pal411
[
0
],
.
idct_factor
=
&
dv_idct_factor_sd
[
0
],
.
pix_fmt
=
PIX_FMT_YUV411P
,
.
bpm
=
6
,
.
block_sizes
=
block_sizes_dv2550
,
.
audio_stride
=
108
,
.
audio_min_samples
=
{
1896
,
1742
,
1264
},
/* for 48, 44.1 and 32kHz */
.
audio_samples_dist
=
{
1920
,
1920
,
1920
,
1920
,
1920
},
.
audio_shuffle
=
dv_audio_shuffle625
,
},
{
.
dsf
=
0
,
.
video_stype
=
0x4
,
.
frame_size
=
240000
,
/* SMPTE-314M - 525/60 (NTSC) 50 Mbps */
.
difseg_size
=
10
,
/* also known as "DVCPRO50" */
.
n_difchan
=
2
,
.
time_base
=
{
1001
,
30000
},
.
ltc_divisor
=
30
,
.
height
=
480
,
.
width
=
720
,
.
sar
=
{{
8
,
9
},
{
32
,
27
}},
.
work_chunks
=
&
work_chunks_dv50ntsc
[
0
],
.
idct_factor
=
&
dv_idct_factor_sd
[
0
],
.
pix_fmt
=
PIX_FMT_YUV422P
,
.
bpm
=
6
,
.
block_sizes
=
block_sizes_dv2550
,
.
audio_stride
=
90
,
.
audio_min_samples
=
{
1580
,
1452
,
1053
},
/* for 48, 44.1 and 32kHz */
.
audio_samples_dist
=
{
1600
,
1602
,
1602
,
1602
,
1602
},
/* per SMPTE-314M */
.
audio_shuffle
=
dv_audio_shuffle525
,
},
{
.
dsf
=
1
,
.
video_stype
=
0x4
,
.
frame_size
=
288000
,
/* SMPTE-314M - 625/50 (PAL) 50 Mbps */
.
difseg_size
=
12
,
/* also known as "DVCPRO50" */
.
n_difchan
=
2
,
.
time_base
=
{
1
,
25
},
.
ltc_divisor
=
25
,
.
height
=
576
,
.
width
=
720
,
.
sar
=
{{
16
,
15
},
{
64
,
45
}},
.
work_chunks
=
&
work_chunks_dv50pal
[
0
],
.
idct_factor
=
&
dv_idct_factor_sd
[
0
],
.
pix_fmt
=
PIX_FMT_YUV422P
,
.
bpm
=
6
,
.
block_sizes
=
block_sizes_dv2550
,
.
audio_stride
=
108
,
.
audio_min_samples
=
{
1896
,
1742
,
1264
},
/* for 48, 44.1 and 32kHz */
.
audio_samples_dist
=
{
1920
,
1920
,
1920
,
1920
,
1920
},
.
audio_shuffle
=
dv_audio_shuffle625
,
},
{
.
dsf
=
0
,
.
video_stype
=
0x14
,
.
frame_size
=
480000
,
/* SMPTE-370M - 1080i60 100 Mbps */
.
difseg_size
=
10
,
/* also known as "DVCPRO HD" */
.
n_difchan
=
4
,
.
time_base
=
{
1001
,
30000
},
.
ltc_divisor
=
30
,
.
height
=
1080
,
.
width
=
1280
,
.
sar
=
{{
1
,
1
},
{
3
,
2
}},
.
work_chunks
=
&
work_chunks_dv100ntsci
[
0
],
.
idct_factor
=
&
dv_idct_factor_hd1080
[
0
],
.
pix_fmt
=
PIX_FMT_YUV422P
,
.
bpm
=
8
,
.
block_sizes
=
block_sizes_dv100
,
.
audio_stride
=
90
,
.
audio_min_samples
=
{
1580
,
1452
,
1053
},
/* for 48, 44.1 and 32kHz */
.
audio_samples_dist
=
{
1600
,
1602
,
1602
,
1602
,
1602
},
/* per SMPTE-314M */
.
audio_shuffle
=
dv_audio_shuffle525
,
},
{
.
dsf
=
1
,
.
video_stype
=
0x14
,
.
frame_size
=
576000
,
/* SMPTE-370M - 1080i50 100 Mbps */
.
difseg_size
=
12
,
/* also known as "DVCPRO HD" */
.
n_difchan
=
4
,
.
time_base
=
{
1
,
25
},
.
ltc_divisor
=
25
,
.
height
=
1080
,
.
width
=
1440
,
.
sar
=
{{
1
,
1
},
{
4
,
3
}},
.
work_chunks
=
&
work_chunks_dv100pali
[
0
],
.
idct_factor
=
&
dv_idct_factor_hd1080
[
0
],
.
pix_fmt
=
PIX_FMT_YUV422P
,
.
bpm
=
8
,
.
block_sizes
=
block_sizes_dv100
,
.
audio_stride
=
108
,
.
audio_min_samples
=
{
1896
,
1742
,
1264
},
/* for 48, 44.1 and 32kHz */
.
audio_samples_dist
=
{
1920
,
1920
,
1920
,
1920
,
1920
},
.
audio_shuffle
=
dv_audio_shuffle625
,
},
{
.
dsf
=
0
,
.
video_stype
=
0x18
,
.
frame_size
=
240000
,
/* SMPTE-370M - 720p60 100 Mbps */
.
difseg_size
=
10
,
/* also known as "DVCPRO HD" */
.
n_difchan
=
2
,
.
time_base
=
{
1001
,
60000
},
.
ltc_divisor
=
60
,
.
height
=
720
,
.
width
=
960
,
.
sar
=
{{
1
,
1
},
{
4
,
3
}},
.
work_chunks
=
&
work_chunks_dv100ntscp
[
0
],
.
idct_factor
=
&
dv_idct_factor_hd720
[
0
],
.
pix_fmt
=
PIX_FMT_YUV422P
,
.
bpm
=
8
,
.
block_sizes
=
block_sizes_dv100
,
.
audio_stride
=
90
,
.
audio_min_samples
=
{
1580
,
1452
,
1053
},
/* for 48, 44.1 and 32kHz */
.
audio_samples_dist
=
{
1600
,
1602
,
1602
,
1602
,
1602
},
/* per SMPTE-314M */
.
audio_shuffle
=
dv_audio_shuffle525
,
},
{
.
dsf
=
1
,
.
video_stype
=
0x18
,
.
frame_size
=
288000
,
/* SMPTE-370M - 720p50 100 Mbps */
.
difseg_size
=
12
,
/* also known as "DVCPRO HD" */
.
n_difchan
=
2
,
.
time_base
=
{
1
,
50
},
.
ltc_divisor
=
50
,
.
height
=
720
,
.
width
=
960
,
.
sar
=
{{
1
,
1
},
{
4
,
3
}},
.
work_chunks
=
&
work_chunks_dv100palp
[
0
],
.
idct_factor
=
&
dv_idct_factor_hd720
[
0
],
.
pix_fmt
=
PIX_FMT_YUV422P
,
.
bpm
=
8
,
.
block_sizes
=
block_sizes_dv100
,
.
audio_stride
=
90
,
.
audio_min_samples
=
{
1896
,
1742
,
1264
},
/* for 48, 44.1 and 32kHz */
.
audio_samples_dist
=
{
1920
,
1920
,
1920
,
1920
,
1920
},
.
audio_shuffle
=
dv_audio_shuffle625
,
},
{
.
dsf
=
1
,
.
video_stype
=
0x1
,
.
frame_size
=
144000
,
/* IEC 61883-5 - 625/50 (PAL) */
.
difseg_size
=
12
,
.
n_difchan
=
1
,
.
time_base
=
{
1
,
25
},
.
ltc_divisor
=
25
,
.
height
=
576
,
.
width
=
720
,
.
sar
=
{{
16
,
15
},
{
64
,
45
}},
.
work_chunks
=
&
work_chunks_dv25pal
[
0
],
.
idct_factor
=
&
dv_idct_factor_sd
[
0
],
.
pix_fmt
=
PIX_FMT_YUV420P
,
.
bpm
=
6
,
.
block_sizes
=
block_sizes_dv2550
,
.
audio_stride
=
108
,
.
audio_min_samples
=
{
1896
,
1742
,
1264
},
/* for 48, 44.1 and 32kHz */
.
audio_samples_dist
=
{
1920
,
1920
,
1920
,
1920
,
1920
},
.
audio_shuffle
=
dv_audio_shuffle625
,
}
};
const
DVprofile
*
avpriv_dv_frame_profile
(
const
DVprofile
*
sys
,
const
uint8_t
*
frame
,
unsigned
buf_size
)
{
int
i
,
dsf
,
stype
;
if
(
buf_size
<
80
*
5
+
48
+
4
)
return
NULL
;
dsf
=
(
frame
[
3
]
&
0x80
)
>>
7
;
stype
=
frame
[
80
*
5
+
48
+
3
]
&
0x1f
;
/* 576i50 25Mbps 4:1:1 is a special case */
if
(
dsf
==
1
&&
stype
==
0
&&
frame
[
4
]
&
0x07
/* the APT field */
)
{
return
&
dv_profiles
[
2
];
}
for
(
i
=
0
;
i
<
FF_ARRAY_ELEMS
(
dv_profiles
);
i
++
)
if
(
dsf
==
dv_profiles
[
i
].
dsf
&&
stype
==
dv_profiles
[
i
].
video_stype
)
return
&
dv_profiles
[
i
];
/* check if old sys matches and assumes corrupted input */
if
(
sys
&&
buf_size
==
sys
->
frame_size
)
return
sys
;
return
NULL
;
}
const
DVprofile
*
avpriv_dv_codec_profile
(
AVCodecContext
*
codec
)
{
int
i
;
for
(
i
=
0
;
i
<
FF_ARRAY_ELEMS
(
dv_profiles
);
i
++
)
if
(
codec
->
height
==
dv_profiles
[
i
].
height
&&
codec
->
pix_fmt
==
dv_profiles
[
i
].
pix_fmt
&&
codec
->
width
==
dv_profiles
[
i
].
width
)
return
&
dv_profiles
[
i
];
return
NULL
;
}
void
ff_dv_print_profiles
(
void
*
logctx
,
int
loglevel
)
{
int
i
;
for
(
i
=
0
;
i
<
FF_ARRAY_ELEMS
(
dv_profiles
);
i
++
)
{
const
DVprofile
*
p
=
&
dv_profiles
[
i
];
av_log
(
logctx
,
loglevel
,
"Frame size: %dx%d; pixel format: %s, "
"framerate: %d/%d
\n
"
,
p
->
width
,
p
->
height
,
av_get_pix_fmt_name
(
p
->
pix_fmt
),
p
->
time_base
.
den
,
p
->
time_base
.
num
);
}
}
libavcodec/dv_profile.h
0 → 100644
View file @
520c1ec6
/*
* This file is part of Libav.
*
* Libav is free software; you can redistribute it and/or
* modify it under the terms of the GNU Lesser General Public
* License as published by the Free Software Foundation; either
* version 2.1 of the License, or (at your option) any later version.
*
* Libav is distributed in the hope that it will be useful,
* but WITHOUT ANY WARRANTY; without even the implied warranty of
* MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the GNU
* Lesser General Public License for more details.
*
* You should have received a copy of the GNU Lesser General Public
* License along with Libav; if not, write to the Free Software
* Foundation, Inc., 51 Franklin Street, Fifth Floor, Boston, MA 02110-1301 USA
*/
#ifndef AVCODEC_DV_PROFILE_H
#define AVCODEC_DV_PROFILE_H
#include <stdint.h>
#include "libavutil/pixfmt.h"
#include "libavutil/rational.h"
#include "avcodec.h"
typedef
struct
DVwork_chunk
{
uint16_t
buf_offset
;
uint16_t
mb_coordinates
[
5
];
}
DVwork_chunk
;
/*
* DVprofile is used to express the differences between various
* DV flavors. For now it's primarily used for differentiating
* 525/60 and 625/50, but the plans are to use it for various
* DV specs as well (e.g. SMPTE314M vs. IEC 61834).
*/
typedef
struct
DVprofile
{
int
dsf
;
/* value of the dsf in the DV header */
int
video_stype
;
/* stype for VAUX source pack */
int
frame_size
;
/* total size of one frame in bytes */
int
difseg_size
;
/* number of DIF segments per DIF channel */
int
n_difchan
;
/* number of DIF channels per frame */
AVRational
time_base
;
/* 1/framerate */
int
ltc_divisor
;
/* FPS from the LTS standpoint */
int
height
;
/* picture height in pixels */
int
width
;
/* picture width in pixels */
AVRational
sar
[
2
];
/* sample aspect ratios for 4:3 and 16:9 */
DVwork_chunk
*
work_chunks
;
/* each thread gets its own chunk of frame to work on */
uint32_t
*
idct_factor
;
/* set of iDCT factor tables */
enum
PixelFormat
pix_fmt
;
/* picture pixel format */
int
bpm
;
/* blocks per macroblock */
const
uint8_t
*
block_sizes
;
/* AC block sizes, in bits */
int
audio_stride
;
/* size of audio_shuffle table */
int
audio_min_samples
[
3
];
/* min amount of audio samples */
/* for 48kHz, 44.1kHz and 32kHz */
int
audio_samples_dist
[
5
];
/* how many samples are supposed to be */
/* in each frame in a 5 frames window */
const
uint8_t
(
*
audio_shuffle
)[
9
];
/* PCM shuffling table */
}
DVprofile
;
const
DVprofile
*
avpriv_dv_frame_profile
(
const
DVprofile
*
sys
,
const
uint8_t
*
frame
,
unsigned
buf_size
);
const
DVprofile
*
avpriv_dv_codec_profile
(
AVCodecContext
*
codec
);
/**
* Print all allowed DV profiles into logctx at specified logging level.
*/
void
ff_dv_print_profiles
(
void
*
logctx
,
int
loglevel
);
#endif
/* AVCODEC_DV_PROFILE_H */
libavcodec/dvdata.c
View file @
520c1ec6
...
...
@@ -24,8 +24,6 @@
* Constants for DV codec.
*/
#include "libavutil/rational.h"
#include "libavutil/pixdesc.h"
#include "avcodec.h"
#include "dvdata.h"
...
...
@@ -122,308 +120,3 @@ const int ff_dv_iweight_720_c[64] = {
394
,
406
,
418
,
438
,
418
,
464
,
464
,
492
,
};
static
DVwork_chunk
work_chunks_dv25pal
[
1
*
12
*
27
];
static
DVwork_chunk
work_chunks_dv25pal411
[
1
*
12
*
27
];
static
DVwork_chunk
work_chunks_dv25ntsc
[
1
*
10
*
27
];
static
DVwork_chunk
work_chunks_dv50pal
[
2
*
12
*
27
];
static
DVwork_chunk
work_chunks_dv50ntsc
[
2
*
10
*
27
];
static
DVwork_chunk
work_chunks_dv100palp
[
2
*
12
*
27
];
static
DVwork_chunk
work_chunks_dv100ntscp
[
2
*
10
*
27
];
static
DVwork_chunk
work_chunks_dv100pali
[
4
*
12
*
27
];
static
DVwork_chunk
work_chunks_dv100ntsci
[
4
*
10
*
27
];
static
uint32_t
dv_idct_factor_sd
[
2
*
2
*
22
*
64
];
static
uint32_t
dv_idct_factor_hd1080
[
2
*
4
*
16
*
64
];
static
uint32_t
dv_idct_factor_hd720
[
2
*
4
*
16
*
64
];
static
const
uint8_t
dv_audio_shuffle525
[
10
][
9
]
=
{
{
0
,
30
,
60
,
20
,
50
,
80
,
10
,
40
,
70
},
/* 1st channel */
{
6
,
36
,
66
,
26
,
56
,
86
,
16
,
46
,
76
},
{
12
,
42
,
72
,
2
,
32
,
62
,
22
,
52
,
82
},
{
18
,
48
,
78
,
8
,
38
,
68
,
28
,
58
,
88
},
{
24
,
54
,
84
,
14
,
44
,
74
,
4
,
34
,
64
},
{
1
,
31
,
61
,
21
,
51
,
81
,
11
,
41
,
71
},
/* 2nd channel */
{
7
,
37
,
67
,
27
,
57
,
87
,
17
,
47
,
77
},
{
13
,
43
,
73
,
3
,
33
,
63
,
23
,
53
,
83
},
{
19
,
49
,
79
,
9
,
39
,
69
,
29
,
59
,
89
},
{
25
,
55
,
85
,
15
,
45
,
75
,
5
,
35
,
65
},
};
static
const
uint8_t
dv_audio_shuffle625
[
12
][
9
]
=
{
{
0
,
36
,
72
,
26
,
62
,
98
,
16
,
52
,
88
},
/* 1st channel */
{
6
,
42
,
78
,
32
,
68
,
104
,
22
,
58
,
94
},
{
12
,
48
,
84
,
2
,
38
,
74
,
28
,
64
,
100
},
{
18
,
54
,
90
,
8
,
44
,
80
,
34
,
70
,
106
},
{
24
,
60
,
96
,
14
,
50
,
86
,
4
,
40
,
76
},
{
30
,
66
,
102
,
20
,
56
,
92
,
10
,
46
,
82
},
{
1
,
37
,
73
,
27
,
63
,
99
,
17
,
53
,
89
},
/* 2nd channel */
{
7
,
43
,
79
,
33
,
69
,
105
,
23
,
59
,
95
},
{
13
,
49
,
85
,
3
,
39
,
75
,
29
,
65
,
101
},
{
19
,
55
,
91
,
9
,
45
,
81
,
35
,
71
,
107
},
{
25
,
61
,
97
,
15
,
51
,
87
,
5
,
41
,
77
},
{
31
,
67
,
103
,
21
,
57
,
93
,
11
,
47
,
83
},
};
/* macroblock bit budgets */
static
const
uint8_t
block_sizes_dv2550
[
8
]
=
{
112
,
112
,
112
,
112
,
80
,
80
,
0
,
0
,
};
static
const
uint8_t
block_sizes_dv100
[
8
]
=
{
80
,
80
,
80
,
80
,
80
,
80
,
64
,
64
,
};
static
const
DVprofile
dv_profiles
[]
=
{
{
.
dsf
=
0
,
.
video_stype
=
0x0
,
.
frame_size
=
120000
,
/* IEC 61834, SMPTE-314M - 525/60 (NTSC) */
.
difseg_size
=
10
,
.
n_difchan
=
1
,
.
time_base
=
{
1001
,
30000
},
.
ltc_divisor
=
30
,
.
height
=
480
,
.
width
=
720
,
.
sar
=
{{
8
,
9
},
{
32
,
27
}},
.
work_chunks
=
&
work_chunks_dv25ntsc
[
0
],
.
idct_factor
=
&
dv_idct_factor_sd
[
0
],
.
pix_fmt
=
PIX_FMT_YUV411P
,
.
bpm
=
6
,
.
block_sizes
=
block_sizes_dv2550
,
.
audio_stride
=
90
,
.
audio_min_samples
=
{
1580
,
1452
,
1053
},
/* for 48, 44.1 and 32kHz */
.
audio_samples_dist
=
{
1600
,
1602
,
1602
,
1602
,
1602
},
/* per SMPTE-314M */
.
audio_shuffle
=
dv_audio_shuffle525
,
},
{
.
dsf
=
1
,
.
video_stype
=
0x0
,
.
frame_size
=
144000
,
/* IEC 61834 - 625/50 (PAL) */
.
difseg_size
=
12
,
.
n_difchan
=
1
,
.
time_base
=
{
1
,
25
},
.
ltc_divisor
=
25
,
.
height
=
576
,
.
width
=
720
,
.
sar
=
{{
16
,
15
},
{
64
,
45
}},
.
work_chunks
=
&
work_chunks_dv25pal
[
0
],
.
idct_factor
=
&
dv_idct_factor_sd
[
0
],
.
pix_fmt
=
PIX_FMT_YUV420P
,
.
bpm
=
6
,
.
block_sizes
=
block_sizes_dv2550
,
.
audio_stride
=
108
,
.
audio_min_samples
=
{
1896
,
1742
,
1264
},
/* for 48, 44.1 and 32kHz */
.
audio_samples_dist
=
{
1920
,
1920
,
1920
,
1920
,
1920
},
.
audio_shuffle
=
dv_audio_shuffle625
,
},
{
.
dsf
=
1
,
.
video_stype
=
0x0
,
.
frame_size
=
144000
,
/* SMPTE-314M - 625/50 (PAL) */
.
difseg_size
=
12
,
.
n_difchan
=
1
,
.
time_base
=
{
1
,
25
},
.
ltc_divisor
=
25
,
.
height
=
576
,
.
width
=
720
,
.
sar
=
{{
16
,
15
},
{
64
,
45
}},
.
work_chunks
=
&
work_chunks_dv25pal411
[
0
],
.
idct_factor
=
&
dv_idct_factor_sd
[
0
],
.
pix_fmt
=
PIX_FMT_YUV411P
,
.
bpm
=
6
,
.
block_sizes
=
block_sizes_dv2550
,
.
audio_stride
=
108
,
.
audio_min_samples
=
{
1896
,
1742
,
1264
},
/* for 48, 44.1 and 32kHz */
.
audio_samples_dist
=
{
1920
,
1920
,
1920
,
1920
,
1920
},
.
audio_shuffle
=
dv_audio_shuffle625
,
},
{
.
dsf
=
0
,
.
video_stype
=
0x4
,
.
frame_size
=
240000
,
/* SMPTE-314M - 525/60 (NTSC) 50 Mbps */
.
difseg_size
=
10
,
/* also known as "DVCPRO50" */
.
n_difchan
=
2
,
.
time_base
=
{
1001
,
30000
},
.
ltc_divisor
=
30
,
.
height
=
480
,
.
width
=
720
,
.
sar
=
{{
8
,
9
},
{
32
,
27
}},
.
work_chunks
=
&
work_chunks_dv50ntsc
[
0
],
.
idct_factor
=
&
dv_idct_factor_sd
[
0
],
.
pix_fmt
=
PIX_FMT_YUV422P
,
.
bpm
=
6
,
.
block_sizes
=
block_sizes_dv2550
,
.
audio_stride
=
90
,
.
audio_min_samples
=
{
1580
,
1452
,
1053
},
/* for 48, 44.1 and 32kHz */
.
audio_samples_dist
=
{
1600
,
1602
,
1602
,
1602
,
1602
},
/* per SMPTE-314M */
.
audio_shuffle
=
dv_audio_shuffle525
,
},
{
.
dsf
=
1
,
.
video_stype
=
0x4
,
.
frame_size
=
288000
,
/* SMPTE-314M - 625/50 (PAL) 50 Mbps */
.
difseg_size
=
12
,
/* also known as "DVCPRO50" */
.
n_difchan
=
2
,
.
time_base
=
{
1
,
25
},
.
ltc_divisor
=
25
,
.
height
=
576
,
.
width
=
720
,
.
sar
=
{{
16
,
15
},
{
64
,
45
}},
.
work_chunks
=
&
work_chunks_dv50pal
[
0
],
.
idct_factor
=
&
dv_idct_factor_sd
[
0
],
.
pix_fmt
=
PIX_FMT_YUV422P
,
.
bpm
=
6
,
.
block_sizes
=
block_sizes_dv2550
,
.
audio_stride
=
108
,
.
audio_min_samples
=
{
1896
,
1742
,
1264
},
/* for 48, 44.1 and 32kHz */
.
audio_samples_dist
=
{
1920
,
1920
,
1920
,
1920
,
1920
},
.
audio_shuffle
=
dv_audio_shuffle625
,
},
{
.
dsf
=
0
,
.
video_stype
=
0x14
,
.
frame_size
=
480000
,
/* SMPTE-370M - 1080i60 100 Mbps */
.
difseg_size
=
10
,
/* also known as "DVCPRO HD" */
.
n_difchan
=
4
,
.
time_base
=
{
1001
,
30000
},
.
ltc_divisor
=
30
,
.
height
=
1080
,
.
width
=
1280
,
.
sar
=
{{
1
,
1
},
{
3
,
2
}},
.
work_chunks
=
&
work_chunks_dv100ntsci
[
0
],
.
idct_factor
=
&
dv_idct_factor_hd1080
[
0
],
.
pix_fmt
=
PIX_FMT_YUV422P
,
.
bpm
=
8
,
.
block_sizes
=
block_sizes_dv100
,
.
audio_stride
=
90
,
.
audio_min_samples
=
{
1580
,
1452
,
1053
},
/* for 48, 44.1 and 32kHz */
.
audio_samples_dist
=
{
1600
,
1602
,
1602
,
1602
,
1602
},
/* per SMPTE-314M */
.
audio_shuffle
=
dv_audio_shuffle525
,
},
{
.
dsf
=
1
,
.
video_stype
=
0x14
,
.
frame_size
=
576000
,
/* SMPTE-370M - 1080i50 100 Mbps */
.
difseg_size
=
12
,
/* also known as "DVCPRO HD" */
.
n_difchan
=
4
,
.
time_base
=
{
1
,
25
},
.
ltc_divisor
=
25
,
.
height
=
1080
,
.
width
=
1440
,
.
sar
=
{{
1
,
1
},
{
4
,
3
}},
.
work_chunks
=
&
work_chunks_dv100pali
[
0
],
.
idct_factor
=
&
dv_idct_factor_hd1080
[
0
],
.
pix_fmt
=
PIX_FMT_YUV422P
,
.
bpm
=
8
,
.
block_sizes
=
block_sizes_dv100
,
.
audio_stride
=
108
,
.
audio_min_samples
=
{
1896
,
1742
,
1264
},
/* for 48, 44.1 and 32kHz */
.
audio_samples_dist
=
{
1920
,
1920
,
1920
,
1920
,
1920
},
.
audio_shuffle
=
dv_audio_shuffle625
,
},
{
.
dsf
=
0
,
.
video_stype
=
0x18
,
.
frame_size
=
240000
,
/* SMPTE-370M - 720p60 100 Mbps */
.
difseg_size
=
10
,
/* also known as "DVCPRO HD" */
.
n_difchan
=
2
,
.
time_base
=
{
1001
,
60000
},
.
ltc_divisor
=
60
,
.
height
=
720
,
.
width
=
960
,
.
sar
=
{{
1
,
1
},
{
4
,
3
}},
.
work_chunks
=
&
work_chunks_dv100ntscp
[
0
],
.
idct_factor
=
&
dv_idct_factor_hd720
[
0
],
.
pix_fmt
=
PIX_FMT_YUV422P
,
.
bpm
=
8
,
.
block_sizes
=
block_sizes_dv100
,
.
audio_stride
=
90
,
.
audio_min_samples
=
{
1580
,
1452
,
1053
},
/* for 48, 44.1 and 32kHz */
.
audio_samples_dist
=
{
1600
,
1602
,
1602
,
1602
,
1602
},
/* per SMPTE-314M */
.
audio_shuffle
=
dv_audio_shuffle525
,
},
{
.
dsf
=
1
,
.
video_stype
=
0x18
,
.
frame_size
=
288000
,
/* SMPTE-370M - 720p50 100 Mbps */
.
difseg_size
=
12
,
/* also known as "DVCPRO HD" */
.
n_difchan
=
2
,
.
time_base
=
{
1
,
50
},
.
ltc_divisor
=
50
,
.
height
=
720
,
.
width
=
960
,
.
sar
=
{{
1
,
1
},
{
4
,
3
}},
.
work_chunks
=
&
work_chunks_dv100palp
[
0
],
.
idct_factor
=
&
dv_idct_factor_hd720
[
0
],
.
pix_fmt
=
PIX_FMT_YUV422P
,
.
bpm
=
8
,
.
block_sizes
=
block_sizes_dv100
,
.
audio_stride
=
90
,
.
audio_min_samples
=
{
1896
,
1742
,
1264
},
/* for 48, 44.1 and 32kHz */
.
audio_samples_dist
=
{
1920
,
1920
,
1920
,
1920
,
1920
},
.
audio_shuffle
=
dv_audio_shuffle625
,
},
{
.
dsf
=
1
,
.
video_stype
=
0x1
,
.
frame_size
=
144000
,
/* IEC 61883-5 - 625/50 (PAL) */
.
difseg_size
=
12
,
.
n_difchan
=
1
,
.
time_base
=
{
1
,
25
},
.
ltc_divisor
=
25
,
.
height
=
576
,
.
width
=
720
,
.
sar
=
{{
16
,
15
},
{
64
,
45
}},
.
work_chunks
=
&
work_chunks_dv25pal
[
0
],
.
idct_factor
=
&
dv_idct_factor_sd
[
0
],
.
pix_fmt
=
PIX_FMT_YUV420P
,
.
bpm
=
6
,
.
block_sizes
=
block_sizes_dv2550
,
.
audio_stride
=
108
,
.
audio_min_samples
=
{
1896
,
1742
,
1264
},
/* for 48, 44.1 and 32kHz */
.
audio_samples_dist
=
{
1920
,
1920
,
1920
,
1920
,
1920
},
.
audio_shuffle
=
dv_audio_shuffle625
,
}
};
const
DVprofile
*
avpriv_dv_frame_profile
(
const
DVprofile
*
sys
,
const
uint8_t
*
frame
,
unsigned
buf_size
)
{
int
i
,
dsf
,
stype
;
if
(
buf_size
<
80
*
5
+
48
+
4
)
return
NULL
;
dsf
=
(
frame
[
3
]
&
0x80
)
>>
7
;
stype
=
frame
[
80
*
5
+
48
+
3
]
&
0x1f
;
/* 576i50 25Mbps 4:1:1 is a special case */
if
(
dsf
==
1
&&
stype
==
0
&&
frame
[
4
]
&
0x07
/* the APT field */
)
{
return
&
dv_profiles
[
2
];
}
for
(
i
=
0
;
i
<
FF_ARRAY_ELEMS
(
dv_profiles
);
i
++
)
if
(
dsf
==
dv_profiles
[
i
].
dsf
&&
stype
==
dv_profiles
[
i
].
video_stype
)
return
&
dv_profiles
[
i
];
/* check if old sys matches and assumes corrupted input */
if
(
sys
&&
buf_size
==
sys
->
frame_size
)
return
sys
;
return
NULL
;
}
const
DVprofile
*
avpriv_dv_codec_profile
(
AVCodecContext
*
codec
)
{
int
i
;
for
(
i
=
0
;
i
<
FF_ARRAY_ELEMS
(
dv_profiles
);
i
++
)
if
(
codec
->
height
==
dv_profiles
[
i
].
height
&&
codec
->
pix_fmt
==
dv_profiles
[
i
].
pix_fmt
&&
codec
->
width
==
dv_profiles
[
i
].
width
)
return
&
dv_profiles
[
i
];
return
NULL
;
}
void
ff_dv_print_profiles
(
void
*
logctx
,
int
loglevel
)
{
int
i
;
for
(
i
=
0
;
i
<
FF_ARRAY_ELEMS
(
dv_profiles
);
i
++
)
{
const
DVprofile
*
p
=
&
dv_profiles
[
i
];
av_log
(
logctx
,
loglevel
,
"Frame size: %dx%d; pixel format: %s, "
"framerate: %d/%d
\n
"
,
p
->
width
,
p
->
height
,
av_get_pix_fmt_name
(
p
->
pix_fmt
),
p
->
time_base
.
den
,
p
->
time_base
.
num
);
}
}
libavcodec/dvdata.h
View file @
520c1ec6
...
...
@@ -27,45 +27,10 @@
#ifndef AVCODEC_DVDATA_H
#define AVCODEC_DVDATA_H
#include "libavutil/rational.h"
#include "avcodec.h"
#include "dsputil.h"
#include "get_bits.h"
typedef
struct
DVwork_chunk
{
uint16_t
buf_offset
;
uint16_t
mb_coordinates
[
5
];
}
DVwork_chunk
;
/*
* DVprofile is used to express the differences between various
* DV flavors. For now it's primarily used for differentiating
* 525/60 and 625/50, but the plans are to use it for various
* DV specs as well (e.g. SMPTE314M vs. IEC 61834).
*/
typedef
struct
DVprofile
{
int
dsf
;
/* value of the dsf in the DV header */
int
video_stype
;
/* stype for VAUX source pack */
int
frame_size
;
/* total size of one frame in bytes */
int
difseg_size
;
/* number of DIF segments per DIF channel */
int
n_difchan
;
/* number of DIF channels per frame */
AVRational
time_base
;
/* 1/framerate */
int
ltc_divisor
;
/* FPS from the LTS standpoint */
int
height
;
/* picture height in pixels */
int
width
;
/* picture width in pixels */
AVRational
sar
[
2
];
/* sample aspect ratios for 4:3 and 16:9 */
DVwork_chunk
*
work_chunks
;
/* each thread gets its own chunk of frame to work on */
uint32_t
*
idct_factor
;
/* set of iDCT factor tables */
enum
PixelFormat
pix_fmt
;
/* picture pixel format */
int
bpm
;
/* blocks per macroblock */
const
uint8_t
*
block_sizes
;
/* AC block sizes, in bits */
int
audio_stride
;
/* size of audio_shuffle table */
int
audio_min_samples
[
3
];
/* min amount of audio samples */
/* for 48kHz, 44.1kHz and 32kHz */
int
audio_samples_dist
[
5
];
/* how many samples are supposed to be */
/* in each frame in a 5 frames window */
const
uint8_t
(
*
audio_shuffle
)[
9
];
/* PCM shuffling table */
}
DVprofile
;
#include "dv_profile.h"
typedef
struct
DVVideoContext
{
const
DVprofile
*
sys
;
...
...
@@ -136,10 +101,6 @@ extern const int ff_dv_iweight_720_c[64];
extern
RL_VLC_ELEM
ff_dv_rl_vlc
[
1184
];
const
DVprofile
*
avpriv_dv_frame_profile
(
const
DVprofile
*
sys
,
const
uint8_t
*
frame
,
unsigned
buf_size
);
const
DVprofile
*
avpriv_dv_codec_profile
(
AVCodecContext
*
codec
);
int
ff_dv_init_dynamic_tables
(
const
DVprofile
*
d
);
int
ff_dvvideo_init
(
AVCodecContext
*
avctx
);
...
...
@@ -164,9 +125,4 @@ static inline void dv_calculate_mb_xy(DVVideoContext *s, DVwork_chunk *work_chun
}
}
/**
* Print all allowed DV profiles into logctx at specified logging level.
*/
void
ff_dv_print_profiles
(
void
*
logctx
,
int
loglevel
);
#endif
/* AVCODEC_DVDATA_H */
libavformat/dv.c
View file @
520c1ec6
...
...
@@ -31,6 +31,7 @@
#include <time.h>
#include "avformat.h"
#include "internal.h"
#include "libavcodec/dv_profile.h"
#include "libavcodec/dvdata.h"
#include "libavutil/intreadwrite.h"
#include "libavutil/mathematics.h"
...
...
libavformat/dvenc.c
View file @
520c1ec6
...
...
@@ -32,6 +32,7 @@
#include "avformat.h"
#include "internal.h"
#include "libavcodec/dv_profile.h"
#include "libavcodec/dvdata.h"
#include "dv.h"
#include "libavutil/fifo.h"
...
...
Write
Preview
Markdown
is supported
0%
Try again
or
attach a new file
Attach a file
Cancel
You are about to add
0
people
to the discussion. Proceed with caution.
Finish editing this message first!
Cancel
Please
register
or
sign in
to comment