mirror of
https://git.ffmpeg.org/ffmpeg.git
synced 2025-12-05 22:40:09 +01:00
Compare commits
10 Commits
| Author | SHA1 | Date | |
|---|---|---|---|
|
|
01e291a592 | ||
|
|
03351cce88 | ||
|
|
46abeb1c32 | ||
|
|
35e36046f1 | ||
|
|
8500de89ea | ||
|
|
a11a18b284 | ||
|
|
7deb7e6acd | ||
|
|
7fb85ad360 | ||
|
|
c8642473e0 | ||
|
|
b1ec41a64f |
@@ -1,7 +1,7 @@
|
||||
Entries are sorted chronologically from oldest to youngest within each release,
|
||||
releases are sorted from youngest to oldest.
|
||||
|
||||
version <next>:
|
||||
version 3.4:
|
||||
- deflicker video filter
|
||||
- doubleweave video filter
|
||||
- lumakey video filter
|
||||
|
||||
15
RELEASE_NOTES
Normal file
15
RELEASE_NOTES
Normal file
@@ -0,0 +1,15 @@
|
||||
|
||||
┌───────────────────────────────────────┐
|
||||
│ RELEASE NOTES for FFmpeg 3.4 "Cantor" │
|
||||
└───────────────────────────────────────┘
|
||||
|
||||
The FFmpeg Project proudly presents FFmpeg 3.4 "Cantor", about 6
|
||||
months after the release of FFmpeg 3.3.
|
||||
|
||||
A complete Changelog is available at the root of the project, and the
|
||||
complete Git history on http://source.ffmpeg.org.
|
||||
|
||||
We hope you will like this release as much as we enjoyed working on it, and
|
||||
as usual, if you have any questions about it, or any FFmpeg related topic,
|
||||
feel free to join us on the #ffmpeg IRC channel (on irc.freenode.net) or ask
|
||||
on the mailing-lists.
|
||||
11
configure
vendored
11
configure
vendored
@@ -3089,9 +3089,9 @@ decklink_indev_deps="decklink threads"
|
||||
decklink_indev_extralibs="-lstdc++"
|
||||
decklink_outdev_deps="decklink threads"
|
||||
decklink_outdev_extralibs="-lstdc++"
|
||||
libndi_newtek_indev_deps="libndi_newtek libdl"
|
||||
libndi_newtek_indev_deps="libndi_newtek"
|
||||
libndi_newtek_indev_extralibs="-lndi"
|
||||
libndi_newtek_outdev_deps="libndi_newtek libdl"
|
||||
libndi_newtek_outdev_deps="libndi_newtek"
|
||||
libndi_newtek_outdev_extralibs="-lndi"
|
||||
dshow_indev_deps="IBaseFilter"
|
||||
dshow_indev_extralibs="-lpsapi -lole32 -lstrmiids -luuid -loleaut32 -lshlwapi"
|
||||
@@ -6309,9 +6309,14 @@ fi
|
||||
|
||||
check_disable_warning(){
|
||||
warning_flag=-W${1#-Wno-}
|
||||
test_cflags $warning_flag && add_cflags $1
|
||||
test_cflags $unknown_warning_flags $warning_flag && add_cflags $1
|
||||
}
|
||||
|
||||
test_cflags -Werror=unused-command-line-argument &&
|
||||
append unknown_warning_flags "-Werror=unused-command-line-argument"
|
||||
test_cflags -Werror=unknown-warning-option &&
|
||||
append unknown_warning_flags "-Werror=unknown-warning-option"
|
||||
|
||||
check_disable_warning -Wno-parentheses
|
||||
check_disable_warning -Wno-switch
|
||||
check_disable_warning -Wno-format-zero-length
|
||||
|
||||
@@ -38,7 +38,7 @@ PROJECT_NAME = FFmpeg
|
||||
# could be handy for archiving the generated documentation or if some version
|
||||
# control system is used.
|
||||
|
||||
PROJECT_NUMBER =
|
||||
PROJECT_NUMBER = 3.4
|
||||
|
||||
# Using the PROJECT_BRIEF tag one can provide an optional one line description
|
||||
# for a project that appears at the top of each page and should give viewer a
|
||||
|
||||
@@ -2665,8 +2665,13 @@ static int process_input_packet(InputStream *ist, const AVPacket *pkt, int no_eo
|
||||
ist->next_dts = AV_NOPTS_VALUE;
|
||||
}
|
||||
|
||||
if (got_output)
|
||||
ist->next_pts += av_rescale_q(duration_pts, ist->st->time_base, AV_TIME_BASE_Q);
|
||||
if (got_output) {
|
||||
if (duration_pts > 0) {
|
||||
ist->next_pts += av_rescale_q(duration_pts, ist->st->time_base, AV_TIME_BASE_Q);
|
||||
} else {
|
||||
ist->next_pts += duration_dts;
|
||||
}
|
||||
}
|
||||
break;
|
||||
case AVMEDIA_TYPE_SUBTITLE:
|
||||
if (repeating)
|
||||
|
||||
@@ -3146,6 +3146,7 @@ typedef struct AVCodecContext {
|
||||
#if FF_API_ARCH_ALPHA
|
||||
#define FF_IDCT_SIMPLEALPHA 23
|
||||
#endif
|
||||
#define FF_IDCT_NONE 24 /* Used by XvMC to extract IDCT coefficients with FF_IDCT_PERM_NONE */
|
||||
#define FF_IDCT_SIMPLEAUTO 128
|
||||
|
||||
/**
|
||||
|
||||
@@ -279,6 +279,7 @@ av_cold void ff_idctdsp_init(IDCTDSPContext *c, AVCodecContext *avctx)
|
||||
c->perm_type = FF_IDCT_PERM_NONE;
|
||||
#endif /* CONFIG_FAANIDCT */
|
||||
} else { // accurate/default
|
||||
/* Be sure FF_IDCT_NONE will select this one, since it uses FF_IDCT_PERM_NONE */
|
||||
c->idct_put = ff_simple_idct_put_8;
|
||||
c->idct_add = ff_simple_idct_add_8;
|
||||
c->idct = ff_simple_idct_8;
|
||||
|
||||
@@ -1217,7 +1217,7 @@ static void setup_hwaccel_for_pixfmt(AVCodecContext *avctx)
|
||||
#endif
|
||||
)
|
||||
if (avctx->idct_algo == FF_IDCT_AUTO)
|
||||
avctx->idct_algo = FF_IDCT_SIMPLE;
|
||||
avctx->idct_algo = FF_IDCT_NONE;
|
||||
|
||||
if (avctx->hwaccel && avctx->pix_fmt == AV_PIX_FMT_XVMC) {
|
||||
Mpeg1Context *s1 = avctx->priv_data;
|
||||
|
||||
@@ -181,6 +181,8 @@ static int decode_0(PAFVideoDecContext *c, uint8_t *pkt, uint8_t code)
|
||||
dend = c->frame[page] + c->frame_size;
|
||||
offset = (x & 0x7F) * 2;
|
||||
j = bytestream2_get_le16(&c->gb) + offset;
|
||||
if (bytestream2_get_bytes_left(&c->gb) < (j - offset) * 16)
|
||||
return AVERROR_INVALIDDATA;
|
||||
do {
|
||||
offset++;
|
||||
if (dst + 3 * c->width + 4 > dend)
|
||||
@@ -198,7 +200,8 @@ static int decode_0(PAFVideoDecContext *c, uint8_t *pkt, uint8_t code)
|
||||
do {
|
||||
set_src_position(c, &src, &send);
|
||||
if ((src + 3 * c->width + 4 > send) ||
|
||||
(dst + 3 * c->width + 4 > dend))
|
||||
(dst + 3 * c->width + 4 > dend) ||
|
||||
bytestream2_get_bytes_left(&c->gb) < 4)
|
||||
return AVERROR_INVALIDDATA;
|
||||
copy_block4(dst, src, c->width, c->width, 4);
|
||||
i++;
|
||||
|
||||
@@ -394,9 +394,10 @@ static int decode_header(SnowContext *s){
|
||||
s->mv_scale += get_symbol(&s->c, s->header_state, 1);
|
||||
s->qbias += get_symbol(&s->c, s->header_state, 1);
|
||||
s->block_max_depth+= get_symbol(&s->c, s->header_state, 1);
|
||||
if(s->block_max_depth > 1 || s->block_max_depth < 0){
|
||||
if(s->block_max_depth > 1 || s->block_max_depth < 0 || s->mv_scale > 256U){
|
||||
av_log(s->avctx, AV_LOG_ERROR, "block_max_depth= %d is too large\n", s->block_max_depth);
|
||||
s->block_max_depth= 0;
|
||||
s->mv_scale = 0;
|
||||
return AVERROR_INVALIDDATA;
|
||||
}
|
||||
if (FFABS(s->qbias) > 127) {
|
||||
|
||||
@@ -816,7 +816,7 @@ do { \
|
||||
|
||||
AVVDPAUContext *av_vdpau_alloc_context(void)
|
||||
{
|
||||
return av_mallocz(sizeof(AVVDPAUContext));
|
||||
return av_mallocz(sizeof(VDPAUHWContext));
|
||||
}
|
||||
|
||||
int av_vdpau_bind_context(AVCodecContext *avctx, VdpDevice device,
|
||||
|
||||
@@ -1076,80 +1076,11 @@ static void vaapi_unmap_to_drm(AVHWFramesContext *dst_fc,
|
||||
static int vaapi_map_to_drm(AVHWFramesContext *hwfc, AVFrame *dst,
|
||||
const AVFrame *src, int flags)
|
||||
{
|
||||
#if CONFIG_VAAPI_1
|
||||
AVVAAPIDeviceContext *hwctx = hwfc->device_ctx->hwctx;
|
||||
VASurfaceID surface_id;
|
||||
VAStatus vas;
|
||||
VADRMPRIMESurfaceDescriptor va_desc;
|
||||
AVDRMFrameDescriptor *drm_desc = NULL;
|
||||
int err, i, j;
|
||||
|
||||
surface_id = (VASurfaceID)(uintptr_t)src->data[3];
|
||||
|
||||
vas = vaExportSurfaceHandle(hwctx->display, surface_id,
|
||||
VA_SURFACE_ATTRIB_MEM_TYPE_DRM_PRIME_2,
|
||||
VA_EXPORT_SURFACE_READ_ONLY |
|
||||
VA_EXPORT_SURFACE_SEPARATE_LAYERS,
|
||||
&va_desc);
|
||||
if (vas != VA_STATUS_SUCCESS) {
|
||||
if (vas == VA_STATUS_ERROR_UNIMPLEMENTED)
|
||||
return AVERROR(ENOSYS);
|
||||
av_log(hwfc, AV_LOG_ERROR, "Failed to export surface %#x: "
|
||||
"%d (%s).\n", surface_id, vas, vaErrorStr(vas));
|
||||
return AVERROR(EIO);
|
||||
}
|
||||
|
||||
drm_desc = av_mallocz(sizeof(*drm_desc));
|
||||
if (!drm_desc) {
|
||||
err = AVERROR(ENOMEM);
|
||||
goto fail;
|
||||
}
|
||||
|
||||
// By some bizarre coincidence, these structures are very similar...
|
||||
drm_desc->nb_objects = va_desc.num_objects;
|
||||
for (i = 0; i < va_desc.num_objects; i++) {
|
||||
drm_desc->objects[i].fd = va_desc.objects[i].fd;
|
||||
drm_desc->objects[i].size = va_desc.objects[i].size;
|
||||
drm_desc->objects[i].format_modifier =
|
||||
va_desc.objects[i].drm_format_modifier;
|
||||
}
|
||||
drm_desc->nb_layers = va_desc.num_layers;
|
||||
for (i = 0; i < va_desc.num_layers; i++) {
|
||||
drm_desc->layers[i].format = va_desc.layers[i].drm_format;
|
||||
drm_desc->layers[i].nb_planes = va_desc.layers[i].num_planes;
|
||||
for (j = 0; j < va_desc.layers[i].num_planes; j++) {
|
||||
drm_desc->layers[i].planes[j].object_index =
|
||||
va_desc.layers[i].object_index[j];
|
||||
drm_desc->layers[i].planes[j].offset =
|
||||
va_desc.layers[i].offset[j];
|
||||
drm_desc->layers[i].planes[j].pitch =
|
||||
va_desc.layers[i].pitch[j];
|
||||
}
|
||||
}
|
||||
|
||||
err = ff_hwframe_map_create(src->hw_frames_ctx, dst, src,
|
||||
&vaapi_unmap_to_drm, drm_desc);
|
||||
if (err < 0)
|
||||
goto fail;
|
||||
|
||||
dst->width = src->width;
|
||||
dst->height = src->height;
|
||||
dst->data[0] = (uint8_t*)drm_desc;
|
||||
|
||||
return 0;
|
||||
|
||||
fail:
|
||||
for (i = 0; i < va_desc.num_objects; i++)
|
||||
close(va_desc.objects[i].fd);
|
||||
av_freep(&drm_desc);
|
||||
return err;
|
||||
#else
|
||||
// Older versions without vaExportSurfaceHandle() are not supported -
|
||||
// in theory this is possible with a combination of vaDeriveImage()
|
||||
// and vaAcquireBufferHandle(), but it doesn't carry enough metadata
|
||||
// to actually use the result in a generic way.
|
||||
return AVERROR(ENOSYS);
|
||||
#endif
|
||||
}
|
||||
#endif
|
||||
|
||||
|
||||
Reference in New Issue
Block a user