early-access version 1680
This commit is contained in:
56
externals/ffmpeg/libavcodec/hevcdec.c
vendored
56
externals/ffmpeg/libavcodec/hevcdec.c
vendored
@@ -32,6 +32,7 @@
|
||||
#include "libavutil/opt.h"
|
||||
#include "libavutil/pixdesc.h"
|
||||
#include "libavutil/stereo3d.h"
|
||||
#include "libavutil/timecode.h"
|
||||
|
||||
#include "bswapdsp.h"
|
||||
#include "bytestream.h"
|
||||
@@ -348,6 +349,15 @@ static void export_stream_params(HEVCContext *s, const HEVCSPS *sps)
|
||||
avctx->colorspace = AVCOL_SPC_UNSPECIFIED;
|
||||
}
|
||||
|
||||
avctx->chroma_sample_location = AVCHROMA_LOC_UNSPECIFIED;
|
||||
if (sps->chroma_format_idc == 1) {
|
||||
if (sps->vui.chroma_loc_info_present_flag) {
|
||||
if (sps->vui.chroma_sample_loc_type_top_field <= 5)
|
||||
avctx->chroma_sample_location = sps->vui.chroma_sample_loc_type_top_field + 1;
|
||||
} else
|
||||
avctx->chroma_sample_location = AVCHROMA_LOC_LEFT;
|
||||
}
|
||||
|
||||
if (vps->vps_timing_info_present_flag) {
|
||||
num = vps->vps_num_units_in_tick;
|
||||
den = vps->vps_time_scale;
|
||||
@@ -414,6 +424,9 @@ static enum AVPixelFormat get_format(HEVCContext *s, const HEVCSPS *sps)
|
||||
#if CONFIG_HEVC_VIDEOTOOLBOX_HWACCEL
|
||||
*fmt++ = AV_PIX_FMT_VIDEOTOOLBOX;
|
||||
#endif
|
||||
#if CONFIG_HEVC_VDPAU_HWACCEL
|
||||
*fmt++ = AV_PIX_FMT_VDPAU;
|
||||
#endif
|
||||
#if CONFIG_HEVC_NVDEC_HWACCEL
|
||||
*fmt++ = AV_PIX_FMT_CUDA;
|
||||
#endif
|
||||
@@ -435,6 +448,9 @@ static enum AVPixelFormat get_format(HEVCContext *s, const HEVCSPS *sps)
|
||||
case AV_PIX_FMT_YUV420P12:
|
||||
case AV_PIX_FMT_YUV444P10:
|
||||
case AV_PIX_FMT_YUV444P12:
|
||||
#if CONFIG_HEVC_VDPAU_HWACCEL
|
||||
*fmt++ = AV_PIX_FMT_VDPAU;
|
||||
#endif
|
||||
#if CONFIG_HEVC_NVDEC_HWACCEL
|
||||
*fmt++ = AV_PIX_FMT_CUDA;
|
||||
#endif
|
||||
@@ -2794,6 +2810,46 @@ static int set_side_data(HEVCContext *s)
|
||||
s->avctx->properties |= FF_CODEC_PROPERTY_CLOSED_CAPTIONS;
|
||||
}
|
||||
|
||||
for (int i = 0; i < s->sei.unregistered.nb_buf_ref; i++) {
|
||||
HEVCSEIUnregistered *unreg = &s->sei.unregistered;
|
||||
|
||||
if (unreg->buf_ref[i]) {
|
||||
AVFrameSideData *sd = av_frame_new_side_data_from_buf(out,
|
||||
AV_FRAME_DATA_SEI_UNREGISTERED,
|
||||
unreg->buf_ref[i]);
|
||||
if (!sd)
|
||||
av_buffer_unref(&unreg->buf_ref[i]);
|
||||
unreg->buf_ref[i] = NULL;
|
||||
}
|
||||
}
|
||||
s->sei.unregistered.nb_buf_ref = 0;
|
||||
|
||||
if (s->sei.timecode.present) {
|
||||
uint32_t *tc_sd;
|
||||
char tcbuf[AV_TIMECODE_STR_SIZE];
|
||||
AVFrameSideData *tcside = av_frame_new_side_data(out, AV_FRAME_DATA_S12M_TIMECODE,
|
||||
sizeof(uint32_t) * 4);
|
||||
if (!tcside)
|
||||
return AVERROR(ENOMEM);
|
||||
|
||||
tc_sd = (uint32_t*)tcside->data;
|
||||
tc_sd[0] = s->sei.timecode.num_clock_ts;
|
||||
|
||||
for (int i = 0; i < tc_sd[0]; i++) {
|
||||
int drop = s->sei.timecode.cnt_dropped_flag[i];
|
||||
int hh = s->sei.timecode.hours_value[i];
|
||||
int mm = s->sei.timecode.minutes_value[i];
|
||||
int ss = s->sei.timecode.seconds_value[i];
|
||||
int ff = s->sei.timecode.n_frames[i];
|
||||
|
||||
tc_sd[i + 1] = av_timecode_get_smpte(s->avctx->framerate, drop, hh, mm, ss, ff);
|
||||
av_timecode_make_smpte_tc_string(tcbuf, tc_sd[i + 1], 0);
|
||||
av_dict_set(&out->metadata, "timecode", tcbuf, 0);
|
||||
}
|
||||
|
||||
s->sei.timecode.num_clock_ts = 0;
|
||||
}
|
||||
|
||||
return 0;
|
||||
}
|
||||
|
||||
|
Reference in New Issue
Block a user