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
c74f8178
Commit
c74f8178
authored
Nov 27, 2012
by
Justin Ruggles
Browse files
Options
Browse Files
Download
Email Patches
Plain Diff
nuv: cosmetics: pretty-printing
parent
5c7bf2dd
Hide whitespace changes
Inline
Side-by-side
Showing
1 changed file
with
147 additions
and
132 deletions
+147
-132
nuv.c
libavformat/nuv.c
+147
-132
No files found.
libavformat/nuv.c
View file @
c74f8178
...
...
@@ -39,14 +39,15 @@ typedef struct {
}
NUVContext
;
typedef
enum
{
NUV_VIDEO
=
'V'
,
NUV_VIDEO
=
'V'
,
NUV_EXTRADATA
=
'D'
,
NUV_AUDIO
=
'A'
,
NUV_SEEKP
=
'R'
,
NUV_MYTHEXT
=
'X'
NUV_AUDIO
=
'A'
,
NUV_SEEKP
=
'R'
,
NUV_MYTHEXT
=
'X'
}
nuv_frametype
;
static
int
nuv_probe
(
AVProbeData
*
p
)
{
static
int
nuv_probe
(
AVProbeData
*
p
)
{
if
(
!
memcmp
(
p
->
buf
,
"NuppelVideo"
,
12
))
return
AVPROBE_SCORE_MAX
;
if
(
!
memcmp
(
p
->
buf
,
"MythTVVideo"
,
12
))
...
...
@@ -65,83 +66,87 @@ static int nuv_probe(AVProbeData *p) {
* @return 1 if all required codec data was found
*/
static
int
get_codec_data
(
AVIOContext
*
pb
,
AVStream
*
vst
,
AVStream
*
ast
,
int
myth
)
{
AVStream
*
ast
,
int
myth
)
{
nuv_frametype
frametype
;
if
(
!
vst
&&
!
myth
)
return
1
;
// no codec data needed
while
(
!
pb
->
eof_reached
)
{
int
size
,
subtype
;
frametype
=
avio_r8
(
pb
);
switch
(
frametype
)
{
case
NUV_EXTRADATA
:
subtype
=
avio_r8
(
pb
);
avio_skip
(
pb
,
6
);
size
=
PKTSIZE
(
avio_rl32
(
pb
));
if
(
vst
&&
subtype
==
'R'
)
{
vst
->
codec
->
extradata_size
=
size
;
vst
->
codec
->
extradata
=
av_malloc
(
size
);
avio_read
(
pb
,
vst
->
codec
->
extradata
,
size
);
size
=
0
;
if
(
!
myth
)
return
1
;
}
case
NUV_EXTRADATA
:
subtype
=
avio_r8
(
pb
);
avio_skip
(
pb
,
6
);
size
=
PKTSIZE
(
avio_rl32
(
pb
));
if
(
vst
&&
subtype
==
'R'
)
{
vst
->
codec
->
extradata_size
=
size
;
vst
->
codec
->
extradata
=
av_malloc
(
size
);
avio_read
(
pb
,
vst
->
codec
->
extradata
,
size
);
size
=
0
;
if
(
!
myth
)
return
1
;
}
break
;
case
NUV_MYTHEXT
:
avio_skip
(
pb
,
7
);
size
=
PKTSIZE
(
avio_rl32
(
pb
));
if
(
size
!=
128
*
4
)
break
;
case
NUV_MYTHEXT
:
avio_skip
(
pb
,
7
);
size
=
PKTSIZE
(
avio_rl32
(
pb
));
if
(
size
!=
128
*
4
)
break
;
avio_rl32
(
pb
);
// version
if
(
vst
)
{
vst
->
codec
->
codec_tag
=
avio_rl32
(
pb
);
vst
->
codec
->
codec_id
=
ff_codec_get_id
(
ff_codec_bmp_tags
,
vst
->
codec
->
codec_tag
);
if
(
vst
->
codec
->
codec_tag
==
MKTAG
(
'R'
,
'J'
,
'P'
,
'G'
))
vst
->
codec
->
codec_id
=
AV_CODEC_ID_NUV
;
}
else
avio_skip
(
pb
,
4
);
avio_rl32
(
pb
);
// version
if
(
vst
)
{
vst
->
codec
->
codec_tag
=
avio_rl32
(
pb
);
vst
->
codec
->
codec_id
=
ff_codec_get_id
(
ff_codec_bmp_tags
,
vst
->
codec
->
codec_tag
);
if
(
vst
->
codec
->
codec_tag
==
MKTAG
(
'R'
,
'J'
,
'P'
,
'G'
))
vst
->
codec
->
codec_id
=
AV_CODEC_ID_NUV
;
}
else
avio_skip
(
pb
,
4
);
if
(
ast
)
{
int
id
;
if
(
ast
)
{
int
id
;
ast
->
codec
->
codec_tag
=
avio_rl32
(
pb
);
ast
->
codec
->
sample_rate
=
avio_rl32
(
pb
);
ast
->
codec
->
bits_per_coded_sample
=
avio_rl32
(
pb
);
ast
->
codec
->
channels
=
avio_rl32
(
pb
);
ast
->
codec
->
channel_layout
=
0
;
ast
->
codec
->
codec_tag
=
avio_rl32
(
pb
);
ast
->
codec
->
sample_rate
=
avio_rl32
(
pb
);
ast
->
codec
->
bits_per_coded_sample
=
avio_rl32
(
pb
);
ast
->
codec
->
channels
=
avio_rl32
(
pb
);
ast
->
codec
->
channel_layout
=
0
;
id
=
ff_wav_codec_get_id
(
ast
->
codec
->
codec_tag
,
ast
->
codec
->
bits_per_coded_sample
);
if
(
id
==
AV_CODEC_ID_NONE
)
{
id
=
ff_codec_get_id
(
nuv_audio_tags
,
ast
->
codec
->
codec_tag
);
if
(
id
==
AV_CODEC_ID_PCM_S16LE
)
id
=
ff_get_pcm_codec_id
(
ast
->
codec
->
bits_per_coded_sample
,
0
,
0
,
~
1
);
}
ast
->
codec
->
codec_id
=
id
;
id
=
ff_wav_codec_get_id
(
ast
->
codec
->
codec_tag
,
ast
->
codec
->
bits_per_coded_sample
);
if
(
id
==
AV_CODEC_ID_NONE
)
{
id
=
ff_codec_get_id
(
nuv_audio_tags
,
ast
->
codec
->
codec_tag
);
if
(
id
==
AV_CODEC_ID_PCM_S16LE
)
id
=
ff_get_pcm_codec_id
(
ast
->
codec
->
bits_per_coded_sample
,
0
,
0
,
~
1
);
}
ast
->
codec
->
codec_id
=
id
;
ast
->
need_parsing
=
AVSTREAM_PARSE_FULL
;
}
else
avio_skip
(
pb
,
4
*
4
);
ast
->
need_parsing
=
AVSTREAM_PARSE_FULL
;
}
else
avio_skip
(
pb
,
4
*
4
);
size
-=
6
*
4
;
avio_skip
(
pb
,
size
);
return
1
;
case
NUV_SEEKP
:
size
=
11
;
break
;
default:
avio_skip
(
pb
,
7
);
size
=
PKTSIZE
(
avio_rl32
(
pb
));
break
;
size
-=
6
*
4
;
avio_skip
(
pb
,
size
);
return
1
;
case
NUV_SEEKP
:
size
=
11
;
break
;
default:
avio_skip
(
pb
,
7
);
size
=
PKTSIZE
(
avio_rl32
(
pb
));
break
;
}
avio_skip
(
pb
,
size
);
}
return
0
;
}
static
int
nuv_header
(
AVFormatContext
*
s
)
{
static
int
nuv_header
(
AVFormatContext
*
s
)
{
NUVContext
*
ctx
=
s
->
priv_data
;
AVIOContext
*
pb
=
s
->
pb
;
char
id_string
[
12
];
...
...
@@ -149,16 +154,17 @@ static int nuv_header(AVFormatContext *s) {
int
is_mythtv
,
width
,
height
,
v_packs
,
a_packs
;
int
stream_nr
=
0
;
AVStream
*
vst
=
NULL
,
*
ast
=
NULL
;
avio_read
(
pb
,
id_string
,
12
);
is_mythtv
=
!
memcmp
(
id_string
,
"MythTVVideo"
,
12
);
avio_skip
(
pb
,
5
);
// version string
avio_skip
(
pb
,
3
);
// padding
width
=
avio_rl32
(
pb
);
avio_skip
(
pb
,
5
);
// version string
avio_skip
(
pb
,
3
);
// padding
width
=
avio_rl32
(
pb
);
height
=
avio_rl32
(
pb
);
avio_rl32
(
pb
);
// unused, "desiredwidth"
avio_rl32
(
pb
);
// unused, "desiredheight"
avio_r8
(
pb
);
// 'P' == progressive, 'I' == interlaced
avio_skip
(
pb
,
3
);
// padding
avio_rl32
(
pb
);
// unused, "desiredwidth"
avio_rl32
(
pb
);
// unused, "desiredheight"
avio_r8
(
pb
);
// 'P' == progressive, 'I' == interlaced
avio_skip
(
pb
,
3
);
// padding
aspect
=
av_int2double
(
avio_rl64
(
pb
));
if
(
aspect
>
0
.
9999
&&
aspect
<
1
.
0001
)
aspect
=
4
.
0
/
3
.
0
;
...
...
@@ -173,15 +179,16 @@ static int nuv_header(AVFormatContext *s) {
if
(
v_packs
)
{
ctx
->
v_id
=
stream_nr
++
;
vst
=
avformat_new_stream
(
s
,
NULL
);
vst
=
avformat_new_stream
(
s
,
NULL
);
if
(
!
vst
)
return
AVERROR
(
ENOMEM
);
vst
->
codec
->
codec_type
=
AVMEDIA_TYPE_VIDEO
;
vst
->
codec
->
codec_id
=
AV_CODEC_ID_NUV
;
vst
->
codec
->
width
=
width
;
vst
->
codec
->
height
=
height
;
vst
->
codec
->
codec_type
=
AVMEDIA_TYPE_VIDEO
;
vst
->
codec
->
codec_id
=
AV_CODEC_ID_NUV
;
vst
->
codec
->
width
=
width
;
vst
->
codec
->
height
=
height
;
vst
->
codec
->
bits_per_coded_sample
=
10
;
vst
->
sample_aspect_ratio
=
av_d2q
(
aspect
*
height
/
width
,
10000
);
vst
->
sample_aspect_ratio
=
av_d2q
(
aspect
*
height
/
width
,
10000
);
#if FF_API_R_FRAME_RATE
vst
->
r_frame_rate
=
#endif
...
...
@@ -192,16 +199,16 @@ static int nuv_header(AVFormatContext *s) {
if
(
a_packs
)
{
ctx
->
a_id
=
stream_nr
++
;
ast
=
avformat_new_stream
(
s
,
NULL
);
ast
=
avformat_new_stream
(
s
,
NULL
);
if
(
!
ast
)
return
AVERROR
(
ENOMEM
);
ast
->
codec
->
codec_type
=
AVMEDIA_TYPE_AUDIO
;
ast
->
codec
->
codec_id
=
AV_CODEC_ID_PCM_S16LE
;
ast
->
codec
->
channels
=
2
;
ast
->
codec
->
channel_layout
=
AV_CH_LAYOUT_STEREO
;
ast
->
codec
->
sample_rate
=
44100
;
ast
->
codec
->
bit_rate
=
2
*
2
*
44100
*
8
;
ast
->
codec
->
block_align
=
2
*
2
;
ast
->
codec
->
codec_type
=
AVMEDIA_TYPE_AUDIO
;
ast
->
codec
->
codec_id
=
AV_CODEC_ID_PCM_S16LE
;
ast
->
codec
->
channels
=
2
;
ast
->
codec
->
channel_layout
=
AV_CH_LAYOUT_STEREO
;
ast
->
codec
->
sample_rate
=
44100
;
ast
->
codec
->
bit_rate
=
2
*
2
*
44100
*
8
;
ast
->
codec
->
block_align
=
2
*
2
;
ast
->
codec
->
bits_per_coded_sample
=
16
;
avpriv_set_pts_info
(
ast
,
32
,
1
,
1000
);
}
else
...
...
@@ -209,76 +216,84 @@ static int nuv_header(AVFormatContext *s) {
get_codec_data
(
pb
,
vst
,
ast
,
is_mythtv
);
ctx
->
rtjpg_video
=
vst
&&
vst
->
codec
->
codec_id
==
AV_CODEC_ID_NUV
;
return
0
;
}
#define HDRSIZE 12
static
int
nuv_packet
(
AVFormatContext
*
s
,
AVPacket
*
pkt
)
{
static
int
nuv_packet
(
AVFormatContext
*
s
,
AVPacket
*
pkt
)
{
NUVContext
*
ctx
=
s
->
priv_data
;
AVIOContext
*
pb
=
s
->
pb
;
uint8_t
hdr
[
HDRSIZE
];
nuv_frametype
frametype
;
int
ret
,
size
;
while
(
!
pb
->
eof_reached
)
{
int
copyhdrsize
=
ctx
->
rtjpg_video
?
HDRSIZE
:
0
;
uint64_t
pos
=
avio_tell
(
pb
);
uint64_t
pos
=
avio_tell
(
pb
);
ret
=
avio_read
(
pb
,
hdr
,
HDRSIZE
);
if
(
ret
<
HDRSIZE
)
return
ret
<
0
?
ret
:
AVERROR
(
EIO
);
frametype
=
hdr
[
0
];
size
=
PKTSIZE
(
AV_RL32
(
&
hdr
[
8
]));
size
=
PKTSIZE
(
AV_RL32
(
&
hdr
[
8
]));
switch
(
frametype
)
{
case
NUV_EXTRADATA
:
if
(
!
ctx
->
rtjpg_video
)
{
avio_skip
(
pb
,
size
);
break
;
}
case
NUV_VIDEO
:
if
(
ctx
->
v_id
<
0
)
{
av_log
(
s
,
AV_LOG_ERROR
,
"Video packet in file without video stream!
\n
"
);
avio_skip
(
pb
,
size
);
break
;
}
ret
=
av_new_packet
(
pkt
,
copyhdrsize
+
size
);
if
(
ret
<
0
)
return
ret
;
// HACK: we have no idea if it is a keyframe,
// but if we mark none seeking will not work at all.
pkt
->
flags
|=
AV_PKT_FLAG_KEY
;
pkt
->
pos
=
pos
;
pkt
->
pts
=
AV_RL32
(
&
hdr
[
4
]);
pkt
->
stream_index
=
ctx
->
v_id
;
memcpy
(
pkt
->
data
,
hdr
,
copyhdrsize
);
ret
=
avio_read
(
pb
,
pkt
->
data
+
copyhdrsize
,
size
);
if
(
ret
<
0
)
{
av_free_packet
(
pkt
);
return
ret
;
}
if
(
ret
<
size
)
av_shrink_packet
(
pkt
,
copyhdrsize
+
ret
);
return
0
;
case
NUV_AUDIO
:
if
(
ctx
->
a_id
<
0
)
{
av_log
(
s
,
AV_LOG_ERROR
,
"Audio packet in file without audio stream!
\n
"
);
avio_skip
(
pb
,
size
);
break
;
}
ret
=
av_get_packet
(
pb
,
pkt
,
size
);
pkt
->
flags
|=
AV_PKT_FLAG_KEY
;
pkt
->
pos
=
pos
;
pkt
->
pts
=
AV_RL32
(
&
hdr
[
4
]);
pkt
->
stream_index
=
ctx
->
a_id
;
if
(
ret
<
0
)
return
ret
;
return
0
;
case
NUV_SEEKP
:
// contains no data, size value is invalid
case
NUV_EXTRADATA
:
if
(
!
ctx
->
rtjpg_video
)
{
avio_skip
(
pb
,
size
);
break
;
default:
}
case
NUV_VIDEO
:
if
(
ctx
->
v_id
<
0
)
{
av_log
(
s
,
AV_LOG_ERROR
,
"Video packet in file without video stream!
\n
"
);
avio_skip
(
pb
,
size
);
break
;
}
ret
=
av_new_packet
(
pkt
,
copyhdrsize
+
size
);
if
(
ret
<
0
)
return
ret
;
// HACK: we have no idea if it is a keyframe,
// but if we mark none seeking will not work at all.
pkt
->
flags
|=
AV_PKT_FLAG_KEY
;
pkt
->
pos
=
pos
;
pkt
->
pts
=
AV_RL32
(
&
hdr
[
4
]);
pkt
->
stream_index
=
ctx
->
v_id
;
memcpy
(
pkt
->
data
,
hdr
,
copyhdrsize
);
ret
=
avio_read
(
pb
,
pkt
->
data
+
copyhdrsize
,
size
);
if
(
ret
<
0
)
{
av_free_packet
(
pkt
);
return
ret
;
}
if
(
ret
<
size
)
av_shrink_packet
(
pkt
,
copyhdrsize
+
ret
);
return
0
;
case
NUV_AUDIO
:
if
(
ctx
->
a_id
<
0
)
{
av_log
(
s
,
AV_LOG_ERROR
,
"Audio packet in file without audio stream!
\n
"
);
avio_skip
(
pb
,
size
);
break
;
}
ret
=
av_get_packet
(
pb
,
pkt
,
size
);
pkt
->
flags
|=
AV_PKT_FLAG_KEY
;
pkt
->
pos
=
pos
;
pkt
->
pts
=
AV_RL32
(
&
hdr
[
4
]);
pkt
->
stream_index
=
ctx
->
a_id
;
if
(
ret
<
0
)
return
ret
;
return
0
;
case
NUV_SEEKP
:
// contains no data, size value is invalid
break
;
default:
avio_skip
(
pb
,
size
);
break
;
}
}
return
AVERROR
(
EIO
);
}
...
...
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