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
ddf5fb71
Commit
ddf5fb71
authored
Sep 21, 2014
by
Thomas Volkert
Committed by
Martin Storsjö
Sep 24, 2014
Browse files
Options
Browse Files
Download
Email Patches
Plain Diff
rtpenc: HEVC/H.265 support
Signed-off-by:
Martin Storsjö
<
martin@martin.st
>
parent
a2efbecc
Hide whitespace changes
Inline
Side-by-side
Showing
7 changed files
with
153 additions
and
2 deletions
+153
-2
Changelog
Changelog
+1
-1
Makefile
libavformat/Makefile
+1
-0
rtpenc.c
libavformat/rtpenc.c
+13
-0
rtpenc.h
libavformat/rtpenc.h
+1
-0
rtpenc_hevc.c
libavformat/rtpenc_hevc.c
+130
-0
sdp.c
libavformat/sdp.c
+6
-0
version.h
libavformat/version.h
+1
-1
No files found.
Changelog
View file @
ddf5fb71
...
...
@@ -3,7 +3,7 @@ releases are sorted from youngest to oldest.
version <next>:
- aliases and defaults for Ogg subtypes (opus, spx)
- HEVC/H.265 RTP payload format (draft v6) depacketizer
- HEVC/H.265 RTP payload format (draft v6)
packetizer and
depacketizer
- avplay now exits by default at the end of playback
...
...
libavformat/Makefile
View file @
ddf5fb71
...
...
@@ -291,6 +291,7 @@ OBJS-$(CONFIG_RTP_MUXER) += rtp.o \
rtpenc_amr.o
\
rtpenc_h263.o
\
rtpenc_h263_rfc2190.o
\
rtpenc_hevc.o
\
rtpenc_jpeg.o
\
rtpenc_mpv.o
\
rtpenc.o
\
...
...
libavformat/rtpenc.c
View file @
ddf5fb71
...
...
@@ -52,6 +52,7 @@ static int is_supported(enum AVCodecID id)
case
AV_CODEC_ID_H263
:
case
AV_CODEC_ID_H263P
:
case
AV_CODEC_ID_H264
:
case
AV_CODEC_ID_HEVC
:
case
AV_CODEC_ID_MPEG1VIDEO
:
case
AV_CODEC_ID_MPEG2VIDEO
:
case
AV_CODEC_ID_MPEG4
:
...
...
@@ -196,6 +197,15 @@ static int rtp_write_header(AVFormatContext *s1)
s
->
nal_length_size
=
(
st
->
codec
->
extradata
[
4
]
&
0x03
)
+
1
;
}
break
;
case
AV_CODEC_ID_HEVC
:
/* Only check for the standardized hvcC version of extradata, keeping
* things simple and similar to the avcC/H264 case above, instead
* of trying to handle the pre-standardization versions (as in
* libavcodec/hevc.c). */
if
(
st
->
codec
->
extradata_size
>
21
&&
st
->
codec
->
extradata
[
0
]
==
1
)
{
s
->
nal_length_size
=
(
st
->
codec
->
extradata
[
21
]
&
0x03
)
+
1
;
}
break
;
case
AV_CODEC_ID_VORBIS
:
case
AV_CODEC_ID_THEORA
:
if
(
!
s
->
max_frames_per_packet
)
s
->
max_frames_per_packet
=
15
;
...
...
@@ -566,6 +576,9 @@ static int rtp_write_packet(AVFormatContext *s1, AVPacket *pkt)
case
AV_CODEC_ID_H263P
:
ff_rtp_send_h263
(
s1
,
pkt
->
data
,
size
);
break
;
case
AV_CODEC_ID_HEVC
:
ff_rtp_send_hevc
(
s1
,
pkt
->
data
,
size
);
break
;
case
AV_CODEC_ID_VORBIS
:
case
AV_CODEC_ID_THEORA
:
ff_rtp_send_xiph
(
s1
,
pkt
->
data
,
size
);
...
...
libavformat/rtpenc.h
View file @
ddf5fb71
...
...
@@ -84,6 +84,7 @@ void ff_rtp_send_h264(AVFormatContext *s1, const uint8_t *buf1, int size);
void
ff_rtp_send_h263
(
AVFormatContext
*
s1
,
const
uint8_t
*
buf1
,
int
size
);
void
ff_rtp_send_h263_rfc2190
(
AVFormatContext
*
s1
,
const
uint8_t
*
buf1
,
int
size
,
const
uint8_t
*
mb_info
,
int
mb_info_size
);
void
ff_rtp_send_hevc
(
AVFormatContext
*
s1
,
const
uint8_t
*
buf1
,
int
size
);
void
ff_rtp_send_aac
(
AVFormatContext
*
s1
,
const
uint8_t
*
buff
,
int
size
);
void
ff_rtp_send_latm
(
AVFormatContext
*
s1
,
const
uint8_t
*
buff
,
int
size
);
void
ff_rtp_send_amr
(
AVFormatContext
*
s1
,
const
uint8_t
*
buff
,
int
size
);
...
...
libavformat/rtpenc_hevc.c
0 → 100644
View file @
ddf5fb71
/*
* RTP packetizer for HEVC/H.265 payload format (draft version 6)
* Copyright (c) 2014 Thomas Volkert <thomas@homer-conferencing.com>
*
* 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 "avc.h"
#include "avformat.h"
#include "rtpenc.h"
#define RTP_HEVC_HEADERS_SIZE 3
static
void
nal_send
(
AVFormatContext
*
ctx
,
const
uint8_t
*
buf
,
int
len
,
int
last_packet_of_frame
)
{
RTPMuxContext
*
rtp_ctx
=
ctx
->
priv_data
;
int
rtp_payload_size
=
rtp_ctx
->
max_payload_size
-
RTP_HEVC_HEADERS_SIZE
;
int
nal_type
=
(
buf
[
0
]
>>
1
)
&
0x3F
;
/* send it as one single NAL unit? */
if
(
len
<=
rtp_ctx
->
max_payload_size
)
{
/* use the original NAL unit buffer and transmit it as RTP payload */
ff_rtp_send_data
(
ctx
,
buf
,
len
,
last_packet_of_frame
);
}
else
{
/*
create the HEVC payload header and transmit the buffer as fragmentation units (FU)
0 1
0 1 2 3 4 5 6 7 8 9 0 1 2 3 4 5
+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+
|F| Type | LayerId | TID |
+-------------+-----------------+
F = 0
Type = 49 (fragmentation unit (FU))
LayerId = 0
TID = 1
*/
rtp_ctx
->
buf
[
0
]
=
49
<<
1
;
rtp_ctx
->
buf
[
1
]
=
1
;
/*
create the FU header
0 1 2 3 4 5 6 7
+-+-+-+-+-+-+-+-+
|S|E| FuType |
+---------------+
S = variable
E = variable
FuType = NAL unit type
*/
rtp_ctx
->
buf
[
2
]
=
nal_type
;
/* set the S bit: mark as start fragment */
rtp_ctx
->
buf
[
2
]
|=
1
<<
7
;
/* pass the original NAL header */
buf
+=
2
;
len
-=
2
;
while
(
len
>
rtp_payload_size
)
{
/* complete and send current RTP packet */
memcpy
(
&
rtp_ctx
->
buf
[
RTP_HEVC_HEADERS_SIZE
],
buf
,
rtp_payload_size
);
ff_rtp_send_data
(
ctx
,
rtp_ctx
->
buf
,
rtp_ctx
->
max_payload_size
,
0
);
buf
+=
rtp_payload_size
;
len
-=
rtp_payload_size
;
/* reset the S bit */
rtp_ctx
->
buf
[
2
]
&=
~
(
1
<<
7
);
}
/* set the E bit: mark as last fragment */
rtp_ctx
->
buf
[
2
]
|=
1
<<
6
;
/* complete and send last RTP packet */
memcpy
(
&
rtp_ctx
->
buf
[
RTP_HEVC_HEADERS_SIZE
],
buf
,
len
);
ff_rtp_send_data
(
ctx
,
rtp_ctx
->
buf
,
len
+
2
,
last_packet_of_frame
);
}
}
void
ff_rtp_send_hevc
(
AVFormatContext
*
ctx
,
const
uint8_t
*
frame_buf
,
int
frame_size
)
{
const
uint8_t
*
next_NAL_unit
;
const
uint8_t
*
buf_ptr
,
*
buf_end
=
frame_buf
+
frame_size
;
RTPMuxContext
*
rtp_ctx
=
ctx
->
priv_data
;
/* use the default 90 KHz time stamp */
rtp_ctx
->
timestamp
=
rtp_ctx
->
cur_timestamp
;
if
(
rtp_ctx
->
nal_length_size
)
buf_ptr
=
ff_avc_mp4_find_startcode
(
frame_buf
,
buf_end
,
rtp_ctx
->
nal_length_size
)
?
frame_buf
:
buf_end
;
else
buf_ptr
=
ff_avc_find_startcode
(
frame_buf
,
buf_end
);
/* find all NAL units and send them as separate packets */
while
(
buf_ptr
<
buf_end
)
{
if
(
rtp_ctx
->
nal_length_size
)
{
next_NAL_unit
=
ff_avc_mp4_find_startcode
(
buf_ptr
,
buf_end
,
rtp_ctx
->
nal_length_size
);
if
(
!
next_NAL_unit
)
next_NAL_unit
=
buf_end
;
buf_ptr
+=
rtp_ctx
->
nal_length_size
;
}
else
{
while
(
!*
(
buf_ptr
++
))
;
next_NAL_unit
=
ff_avc_find_startcode
(
buf_ptr
,
buf_end
);
}
/* send the next NAL unit */
nal_send
(
ctx
,
buf_ptr
,
next_NAL_unit
-
buf_ptr
,
next_NAL_unit
==
buf_end
);
/* jump to the next NAL unit */
buf_ptr
=
next_NAL_unit
;
}
}
libavformat/sdp.c
View file @
ddf5fb71
...
...
@@ -428,6 +428,12 @@ static char *sdp_write_media_attributes(char *buff, int size, AVCodecContext *c,
payload_type
,
payload_type
,
c
->
width
,
c
->
height
);
break
;
case
AV_CODEC_ID_HEVC
:
if
(
c
->
extradata_size
)
av_log
(
NULL
,
AV_LOG_WARNING
,
"HEVC extradata not currently "
"passed properly through SDP
\n
"
);
av_strlcatf
(
buff
,
size
,
"a=rtpmap:%d H265/90000
\r\n
"
,
payload_type
);
break
;
case
AV_CODEC_ID_MPEG4
:
if
(
c
->
extradata_size
)
{
config
=
extradata2config
(
c
);
...
...
libavformat/version.h
View file @
ddf5fb71
...
...
@@ -30,7 +30,7 @@
#include "libavutil/version.h"
#define LIBAVFORMAT_VERSION_MAJOR 56
#define LIBAVFORMAT_VERSION_MINOR
4
#define LIBAVFORMAT_VERSION_MINOR
5
#define LIBAVFORMAT_VERSION_MICRO 0
#define LIBAVFORMAT_VERSION_INT AV_VERSION_INT(LIBAVFORMAT_VERSION_MAJOR, \
...
...
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