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
b6c61fb8
Commit
b6c61fb8
authored
Mar 03, 2014
by
Tim Walker
Committed by
Vittorio Giovara
Mar 09, 2014
Browse files
Options
Browse Files
Download
Email Patches
Plain Diff
movenc: enable Annex B to MP4 conversion for HEVC tracks.
parent
20b40a59
Hide whitespace changes
Inline
Side-by-side
Showing
3 changed files
with
158 additions
and
0 deletions
+158
-0
hevc.c
libavformat/hevc.c
+101
-0
hevc.h
libavformat/hevc.h
+48
-0
movenc.c
libavformat/movenc.c
+9
-0
No files found.
libavformat/hevc.c
View file @
b6c61fb8
...
...
@@ -1014,6 +1014,107 @@ static int hvcc_write(AVIOContext *pb, HEVCDecoderConfigurationRecord *hvcc)
return
0
;
}
int
ff_hevc_annexb2mp4
(
AVIOContext
*
pb
,
const
uint8_t
*
buf_in
,
int
size
,
int
filter_ps
,
int
*
ps_count
)
{
int
num_ps
=
0
,
ret
=
0
;
uint8_t
*
buf
,
*
end
,
*
start
=
NULL
;
if
(
!
filter_ps
)
{
ret
=
ff_avc_parse_nal_units
(
pb
,
buf_in
,
size
);
goto
end
;
}
ret
=
ff_avc_parse_nal_units_buf
(
buf_in
,
&
start
,
&
size
);
if
(
ret
<
0
)
goto
end
;
ret
=
0
;
buf
=
start
;
end
=
start
+
size
;
while
(
end
-
buf
>
4
)
{
uint32_t
len
=
FFMIN
(
AV_RB32
(
buf
),
end
-
buf
-
4
);
uint8_t
type
=
(
buf
[
4
]
>>
1
)
&
0x3f
;
buf
+=
4
;
switch
(
type
)
{
case
NAL_VPS
:
case
NAL_SPS
:
case
NAL_PPS
:
num_ps
++
;
break
;
default:
ret
+=
4
+
len
;
avio_wb32
(
pb
,
len
);
avio_write
(
pb
,
buf
,
len
);
break
;
}
buf
+=
len
;
}
end:
free
(
start
);
if
(
ps_count
)
*
ps_count
=
num_ps
;
return
ret
;
}
int
ff_hevc_annexb2mp4_buf
(
const
uint8_t
*
buf_in
,
uint8_t
**
buf_out
,
int
*
size
,
int
filter_ps
,
int
*
ps_count
)
{
AVIOContext
*
pb
;
int
num_ps
=
0
,
ret
=
0
;
uint8_t
*
buf
,
*
end
,
*
start
=
NULL
;
if
(
!
filter_ps
)
{
ret
=
ff_avc_parse_nal_units_buf
(
buf_in
,
buf_out
,
size
);
goto
end
;
}
ret
=
avio_open_dyn_buf
(
&
pb
);
if
(
ret
<
0
)
goto
end
;
ret
=
ff_avc_parse_nal_units_buf
(
buf_in
,
&
start
,
size
);
if
(
ret
<
0
)
goto
end
;
buf
=
start
;
end
=
start
+
*
size
;
while
(
end
-
buf
>
4
)
{
uint32_t
len
=
FFMIN
(
AV_RB32
(
buf
),
end
-
buf
-
4
);
uint8_t
type
=
(
buf
[
4
]
>>
1
)
&
0x3f
;
buf
+=
4
;
switch
(
type
)
{
case
NAL_VPS
:
case
NAL_SPS
:
case
NAL_PPS
:
num_ps
++
;
break
;
default:
avio_wb32
(
pb
,
len
);
avio_write
(
pb
,
buf
,
len
);
break
;
}
buf
+=
len
;
}
*
size
=
avio_close_dyn_buf
(
pb
,
buf_out
);
end:
free
(
start
);
if
(
ps_count
)
*
ps_count
=
num_ps
;
return
ret
;
}
int
ff_isom_write_hvcc
(
AVIOContext
*
pb
,
const
uint8_t
*
data
,
int
size
,
int
ps_array_completeness
)
{
...
...
libavformat/hevc.h
View file @
b6c61fb8
...
...
@@ -29,6 +29,54 @@
#include <stdint.h>
#include "avio.h"
/**
* Writes Annex B formatted HEVC NAL units to the provided AVIOContext.
*
* The NAL units are converted to an MP4-compatible format (start code prefixes
* are replaced by 4-byte size fields, as per ISO/IEC 14496-15).
*
* If filter_ps is non-zero, any HEVC parameter sets found in the input will be
* discarded, and *ps_count will be set to the number of discarded PS NAL units.
*
* @param pb address of the AVIOContext where the data shall be written
* @param buf_in address of the buffer holding the input data
* @param size size (in bytes) of the input buffer
* @param filter_ps whether to write parameter set NAL units to the output (0)
* or to discard them (non-zero)
* @param ps_count address of the variable where the number of discarded
* parameter set NAL units shall be written, may be NULL
* @return the amount (in bytes) of data written in case of success, a negative
* value corresponding to an AVERROR code in case of failure
*/
int
ff_hevc_annexb2mp4
(
AVIOContext
*
pb
,
const
uint8_t
*
buf_in
,
int
size
,
int
filter_ps
,
int
*
ps_count
);
/**
* Writes Annex B formatted HEVC NAL units to a data buffer.
*
* The NAL units are converted to an MP4-compatible format (start code prefixes
* are replaced by 4-byte size fields, as per ISO/IEC 14496-15).
*
* If filter_ps is non-zero, any HEVC parameter sets found in the input will be
* discarded, and *ps_count will be set to the number of discarded PS NAL units.
*
* On output, *size holds the size (in bytes) of the output data buffer.
*
* @param buf_in address of the buffer holding the input data
* @param size address of the variable holding the size (in bytes) of the input
* buffer (on input) and of the output buffer (on output)
* @param buf_out address of the variable holding the address of the output
* buffer
* @param filter_ps whether to write parameter set NAL units to the output (0)
* or to discard them (non-zero)
* @param ps_count address of the variable where the number of discarded
* parameter set NAL units shall be written, may be NULL
* @return 0 in case of success, a negative value corresponding to an AVERROR
* code in case of failure
*/
int
ff_hevc_annexb2mp4_buf
(
const
uint8_t
*
buf_in
,
uint8_t
**
buf_out
,
int
*
size
,
int
filter_ps
,
int
*
ps_count
);
/**
* Writes HEVC extradata (parameter sets, declarative SEI NAL units) to the
* provided AVIOContext.
...
...
libavformat/movenc.c
View file @
b6c61fb8
...
...
@@ -2939,6 +2939,15 @@ int ff_mov_write_packet(AVFormatContext *s, AVPacket *pkt)
}
else
{
size
=
ff_avc_parse_nal_units
(
pb
,
pkt
->
data
,
pkt
->
size
);
}
}
else
if
(
enc
->
codec_id
==
AV_CODEC_ID_HEVC
&&
trk
->
vos_len
>
6
&&
(
AV_RB24
(
trk
->
vos_data
)
==
1
||
AV_RB32
(
trk
->
vos_data
)
==
1
))
{
/* extradata is Annex B, assume the bitstream is too and convert it */
if
(
trk
->
hint_track
>=
0
&&
trk
->
hint_track
<
mov
->
nb_streams
)
{
ff_hevc_annexb2mp4_buf
(
pkt
->
data
,
&
reformatted_data
,
&
size
,
0
,
NULL
);
avio_write
(
pb
,
reformatted_data
,
size
);
}
else
{
size
=
ff_hevc_annexb2mp4
(
pb
,
pkt
->
data
,
pkt
->
size
,
0
,
NULL
);
}
}
else
{
avio_write
(
pb
,
pkt
->
data
,
size
);
}
...
...
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