diff options
Diffstat (limited to 'libmpcodecs')
-rw-r--r-- | libmpcodecs/ad_ffmpeg.c | 42 | ||||
-rw-r--r-- | libmpcodecs/vd_ffmpeg.c | 27 | ||||
-rw-r--r-- | libmpcodecs/vf.c | 4 | ||||
-rw-r--r-- | libmpcodecs/vf_ass.c | 50 | ||||
-rw-r--r-- | libmpcodecs/vf_fspp.c | 14 | ||||
-rw-r--r-- | libmpcodecs/vf_scale.c | 13 | ||||
-rw-r--r-- | libmpcodecs/vf_scale.h | 1 | ||||
-rw-r--r-- | libmpcodecs/vf_vo.c | 37 |
8 files changed, 80 insertions, 108 deletions
diff --git a/libmpcodecs/ad_ffmpeg.c b/libmpcodecs/ad_ffmpeg.c index 762c80282d..cd742cf8f8 100644 --- a/libmpcodecs/ad_ffmpeg.c +++ b/libmpcodecs/ad_ffmpeg.c @@ -20,6 +20,7 @@ #include <stdlib.h> #include <unistd.h> #include <stdbool.h> +#include <assert.h> #include <libavcodec/avcodec.h> @@ -47,7 +48,7 @@ LIBAD_EXTERN(ffmpeg) struct priv { AVCodecContext *avctx; - bool old_packet; + int previous_data_left; }; static int preinit(sh_audio_t *sh) @@ -230,7 +231,7 @@ static int control(sh_audio_t *sh, int cmd, void *arg, ...) case ADCTRL_RESYNC_STREAM: avcodec_flush_buffers(ctx->avctx); ds_clear_parser(sh->ds); - ctx->old_packet = false; + ctx->previous_data_left = 0; return CONTROL_TRUE; } return CONTROL_UNKNOWN; @@ -247,23 +248,37 @@ static int decode_audio(sh_audio_t *sh_audio, unsigned char *buf, int minlen, while (len < minlen) { AVPacket pkt; int len2 = maxlen; - double pts; - int x = ds_get_packet_pts(sh_audio->ds, &start, &pts); - if (x <= 0) { + double pts = MP_NOPTS_VALUE; + int x; + bool packet_already_used = ctx->previous_data_left; + struct demux_packet *mpkt = ds_get_packet2(sh_audio->ds, + ctx->previous_data_left); + if (!mpkt) { + assert(!ctx->previous_data_left); start = NULL; x = 0; - ds_parse(sh_audio->ds, &start, &x, MP_NOPTS_VALUE, 0); + ds_parse(sh_audio->ds, &start, &x, pts, 0); if (x <= 0) break; // error } else { - int in_size = x; + assert(mpkt->len >= ctx->previous_data_left); + if (!ctx->previous_data_left) { + ctx->previous_data_left = mpkt->len; + pts = mpkt->pts; + } + x = ctx->previous_data_left; + start = mpkt->buffer + mpkt->len - ctx->previous_data_left; int consumed = ds_parse(sh_audio->ds, &start, &x, pts, 0); - sh_audio->ds->buffer_pos -= in_size - consumed; + ctx->previous_data_left -= consumed; } av_init_packet(&pkt); pkt.data = start; pkt.size = x; - if (pts != MP_NOPTS_VALUE && !ctx->old_packet) { + if (mpkt && mpkt->avpacket) { + pkt.side_data = mpkt->avpacket->side_data; + pkt.side_data_elems = mpkt->avpacket->side_data_elems; + } + if (pts != MP_NOPTS_VALUE && !packet_already_used) { sh_audio->pts = pts; sh_audio->pts_bytes = 0; } @@ -275,14 +290,11 @@ static int decode_audio(sh_audio_t *sh_audio, unsigned char *buf, int minlen, mp_msg(MSGT_DECAUDIO, MSGL_V, "lavc_audio: error\n"); break; } - if (!sh_audio->parser && y < x) { - sh_audio->ds->buffer_pos += y - x; // put back data (HACK!) - ctx->old_packet = true; - } + if (!sh_audio->parser) + ctx->previous_data_left += x - y; if (len2 > 0) { if (avctx->channels >= 5) { - int samplesize = av_get_bits_per_sample_format( - avctx->sample_fmt) / 8; + int samplesize = av_get_bytes_per_sample(avctx->sample_fmt); reorder_channel_nch(buf, AF_CHANNEL_LAYOUT_LAVC_DEFAULT, AF_CHANNEL_LAYOUT_MPLAYER_DEFAULT, avctx->channels, diff --git a/libmpcodecs/vd_ffmpeg.c b/libmpcodecs/vd_ffmpeg.c index b7f189ec5f..0688aae7cc 100644 --- a/libmpcodecs/vd_ffmpeg.c +++ b/libmpcodecs/vd_ffmpeg.c @@ -147,10 +147,7 @@ static int init(sh_video_t *sh) && lavc_codec->id != CODEC_ID_H264 && lavc_codec->id != CODEC_ID_INTERPLAY_VIDEO && lavc_codec->id != CODEC_ID_ROQ && lavc_codec->id != CODEC_ID_VP8 -#if LIBAVCODEC_VERSION_INT >= AV_VERSION_INT(52, 108, 0) - && lavc_codec->id != CODEC_ID_LAGARITH -#endif - ) + && lavc_codec->id != CODEC_ID_LAGARITH) ctx->do_dr1 = 1; ctx->b_age = ctx->ip_age[0] = ctx->ip_age[1] = 256 * 256 * 256 * 64; ctx->ip_count = ctx->b_count = 0; @@ -314,27 +311,12 @@ static int init(sh_video_t *sh) memcpy(avctx->extradata, sh->bih + 1, avctx->extradata_size); break; } - /* Pass palette to codec */ - if (sh->bih && (sh->bih->biBitCount <= 8)) { - avctx->palctrl = calloc(1, sizeof(AVPaletteControl)); - avctx->palctrl->palette_changed = 1; - if (sh->bih->biSize - sizeof(*sh->bih)) - /* Palette size in biSize */ - memcpy(avctx->palctrl->palette, sh->bih + 1, - FFMIN(sh->bih->biSize - sizeof(*sh->bih), AVPALETTE_SIZE)); - else - /* Palette size in biClrUsed */ - memcpy(avctx->palctrl->palette, sh->bih + 1, - FFMIN(sh->bih->biClrUsed * 4, AVPALETTE_SIZE)); - } if (sh->bih) avctx->bits_per_coded_sample = sh->bih->biBitCount; - if (lavc_param->threads > 1) { - avctx->thread_count = lavc_param->threads; - avcodec_thread_init(avctx, lavc_param->threads); - } + avctx->thread_count = lavc_param->threads; + /* open it */ if (avcodec_open(avctx, lavc_codec) < 0) { mp_tmsg(MSGT_DECVIDEO, MSGL_ERR, "Could not open codec.\n"); @@ -365,7 +347,6 @@ static void uninit(sh_video_t *sh) mp_tmsg(MSGT_DECVIDEO, MSGL_ERR, "Could not close codec.\n"); av_freep(&avctx->extradata); - free(avctx->palctrl); av_freep(&avctx->slice_offset); } @@ -663,12 +644,10 @@ static struct mp_image *decode(struct sh_video *sh, struct demux_packet *packet, pkt.size = len; // HACK: make PNGs decode normally instead of as CorePNG delta frames pkt.flags = AV_PKT_FLAG_KEY; -#if LIBAVCODEC_VERSION_MAJOR >= 53 if (packet && packet->avpacket) { pkt.side_data = packet->avpacket->side_data; pkt.side_data_elems = packet->avpacket->side_data_elems; } -#endif // The avcodec opaque field stupidly supports only int64_t type union pts { int64_t i; double d; }; avctx->reordered_opaque = (union pts){.d = *reordered_pts}.i; diff --git a/libmpcodecs/vf.c b/libmpcodecs/vf.c index 34790e3d62..d973db6d3e 100644 --- a/libmpcodecs/vf.c +++ b/libmpcodecs/vf.c @@ -138,6 +138,7 @@ static const vf_info_t *const filter_list[] = { &vf_info_lavc, &vf_info_lavcdeint, &vf_info_screenshot, + &vf_info_fspp, &vf_info_uspp, &vf_info_dvbscale, @@ -182,13 +183,10 @@ static const vf_info_t *const filter_list[] = { &vf_info_hue, #ifdef CONFIG_FFMPEG_INTERNALS &vf_info_spp, - &vf_info_fspp, &vf_info_mcdeint, #endif -#ifdef CONFIG_FFMPEG_EVAL_API &vf_info_geq, &vf_info_qp, -#endif &vf_info_yuvcsp, &vf_info_kerndeint, &vf_info_rgbtest, diff --git a/libmpcodecs/vf_ass.c b/libmpcodecs/vf_ass.c index a062149364..ce80caa74b 100644 --- a/libmpcodecs/vf_ass.c +++ b/libmpcodecs/vf_ass.c @@ -61,8 +61,9 @@ static const struct vf_priv_s { int auto_insert; struct osd_state *osd; - ASS_Renderer *renderer_realaspect; - ASS_Renderer *renderer_vsfilter; + ASS_Renderer *renderer; + + double realaspect; unsigned char *planes[3]; struct line_limits { @@ -93,14 +94,10 @@ static int config(struct vf_instance *vf, vf->priv->planes[2] = malloc(vf->priv->outw * vf->priv->outh); vf->priv->line_limits = malloc((vf->priv->outh + 1) / 2 * sizeof(*vf->priv->line_limits)); - if (vf->priv->renderer_realaspect) { - mp_ass_configure(vf->priv->renderer_realaspect, opts, - vf->priv->outw, vf->priv->outh, 0); - mp_ass_configure(vf->priv->renderer_vsfilter, opts, + if (vf->priv->renderer) { + mp_ass_configure(vf->priv->renderer, opts, vf->priv->outw, vf->priv->outh, 0); - ass_set_aspect_ratio(vf->priv->renderer_realaspect, - (double)width / height * d_height / d_width, 1); - ass_set_aspect_ratio(vf->priv->renderer_vsfilter, 1, 1); + vf->priv->realaspect = (double)width / height * d_height / d_width; } return vf_next_config(vf, vf->priv->outw, vf->priv->outh, d_width, @@ -363,17 +360,16 @@ static int put_image(struct vf_instance *vf, mp_image_t *mpi, double pts) { struct osd_state *osd = vf->priv->osd; ASS_Image *images = 0; - ASS_Renderer *renderer = osd->vsfilter_aspect + double scale = osd->vsfilter_aspect && vf->opts->ass_vsfilter_aspect_compat - ? vf->priv->renderer_vsfilter : vf->priv->renderer_realaspect; - if (sub_visibility && renderer && osd->ass_track + ? 1 : vf->priv->realaspect; + if (sub_visibility && vf->priv->renderer && osd->ass_track && (pts != MP_NOPTS_VALUE)) { - if (osd->ass_force_reload) { - mp_ass_reload_options(vf->priv->renderer_realaspect, vf->opts); - mp_ass_reload_options(vf->priv->renderer_vsfilter, vf->opts); - } + ass_set_aspect_ratio(vf->priv->renderer, scale, 1); + if (osd->ass_force_reload) + mp_ass_reload_options(vf->priv->renderer, vf->opts); osd->ass_force_reload = false; - images = ass_render_frame(renderer, osd->ass_track, + images = ass_render_frame(vf->priv->renderer, osd->ass_track, (pts + sub_delay) * 1000 + .5, NULL); } @@ -402,19 +398,13 @@ static int control(vf_instance_t *vf, int request, void *data) vf->priv->osd = data; break; case VFCTRL_INIT_EOSD: - vf->priv->renderer_realaspect = ass_renderer_init((ASS_Library *)data); - if (!vf->priv->renderer_realaspect) + vf->priv->renderer = ass_renderer_init((ASS_Library *)data); + if (!vf->priv->renderer) return CONTROL_FALSE; - vf->priv->renderer_vsfilter = ass_renderer_init((ASS_Library *)data); - if (!vf->priv->renderer_vsfilter) { - ass_renderer_done(vf->priv->renderer_realaspect); - return CONTROL_FALSE; - } - mp_ass_configure_fonts(vf->priv->renderer_realaspect); - mp_ass_configure_fonts(vf->priv->renderer_vsfilter); + mp_ass_configure_fonts(vf->priv->renderer); return CONTROL_TRUE; case VFCTRL_DRAW_EOSD: - if (vf->priv->renderer_realaspect) + if (vf->priv->renderer) return CONTROL_TRUE; break; } @@ -423,10 +413,8 @@ static int control(vf_instance_t *vf, int request, void *data) static void uninit(struct vf_instance *vf) { - if (vf->priv->renderer_realaspect) { - ass_renderer_done(vf->priv->renderer_realaspect); - ass_renderer_done(vf->priv->renderer_vsfilter); - } + if (vf->priv->renderer) + ass_renderer_done(vf->priv->renderer); free(vf->priv->planes[1]); free(vf->priv->planes[2]); free(vf->priv->line_limits); diff --git a/libmpcodecs/vf_fspp.c b/libmpcodecs/vf_fspp.c index e7e3af8310..da54892fb1 100644 --- a/libmpcodecs/vf_fspp.c +++ b/libmpcodecs/vf_fspp.c @@ -38,6 +38,10 @@ #include <inttypes.h> #include <math.h> +#include <libavutil/intreadwrite.h> +#include <libavutil/mem.h> +#include <libavcodec/avcodec.h> + #include "config.h" #include "mp_msg.h" @@ -46,15 +50,9 @@ #include "mp_image.h" #include "vf.h" #include "libvo/fastmemcpy.h" +#include "mangle.h" -#include "libavutil/internal.h" -#include "libavutil/intreadwrite.h" -#include "libavutil/mem.h" -#include "libavcodec/avcodec.h" -#include "libavcodec/dsputil.h" - -#undef free -#undef malloc +typedef short DCTELEM; //===========================================================================// #define BLOCKSZ 12 diff --git a/libmpcodecs/vf_scale.c b/libmpcodecs/vf_scale.c index 585ef4d9a1..6bb076c744 100644 --- a/libmpcodecs/vf_scale.c +++ b/libmpcodecs/vf_scale.c @@ -704,7 +704,7 @@ void sws_getFlagsAndFilterFromCmdLine(int *flags, SwsFilter **srcFilterParam, Sw } // will use sws_flags & src_filter (from cmd line) -struct SwsContext *sws_getContextFromCmdLine(int srcW, int srcH, int srcFormat, int dstW, int dstH, int dstFormat) +static struct SwsContext *sws_getContextFromCmdLine2(int srcW, int srcH, int srcFormat, int dstW, int dstH, int dstFormat, int extraflags) { int flags; SwsFilter *dstFilterParam, *srcFilterParam; @@ -718,6 +718,17 @@ struct SwsContext *sws_getContextFromCmdLine(int srcW, int srcH, int srcFormat, return sws_getContext(srcW, srcH, sfmt, dstW, dstH, dfmt, flags | get_sws_cpuflags(), srcFilterParam, dstFilterParam, NULL); } +struct SwsContext *sws_getContextFromCmdLine(int srcW, int srcH, int srcFormat, int dstW, int dstH, int dstFormat) +{ + return sws_getContextFromCmdLine2(srcW, srcH, srcFormat, dstW, dstH, dstFormat, 0); +} + +struct SwsContext *sws_getContextFromCmdLine_hq(int srcW, int srcH, int srcFormat, int dstW, int dstH, int dstFormat) +{ + return sws_getContextFromCmdLine2(srcW, srcH, srcFormat, dstW, dstH, dstFormat, + SWS_FULL_CHR_H_INT | SWS_FULL_CHR_H_INP | SWS_ACCURATE_RND | SWS_BITEXACT); +} + /// An example of presets usage static const struct size_preset { char* name; diff --git a/libmpcodecs/vf_scale.h b/libmpcodecs/vf_scale.h index a9b3b506d5..08d651ce16 100644 --- a/libmpcodecs/vf_scale.h +++ b/libmpcodecs/vf_scale.h @@ -21,6 +21,7 @@ int get_sws_cpuflags(void); struct SwsContext *sws_getContextFromCmdLine(int srcW, int srcH, int srcFormat, int dstW, int dstH, int dstFormat); +struct SwsContext *sws_getContextFromCmdLine_hq(int srcW, int srcH, int srcFormat, int dstW, int dstH, int dstFormat); struct mp_csp_details; int mp_sws_set_colorspace(struct SwsContext *sws, struct mp_csp_details *csp); diff --git a/libmpcodecs/vf_vo.c b/libmpcodecs/vf_vo.c index b855ea86df..9c0e90bb61 100644 --- a/libmpcodecs/vf_vo.c +++ b/libmpcodecs/vf_vo.c @@ -40,8 +40,7 @@ extern float sub_delay; struct vf_priv_s { struct vo *vo; #ifdef CONFIG_ASS - ASS_Renderer *renderer_realaspect; - ASS_Renderer *renderer_vsfilter; + ASS_Renderer *renderer; bool prev_visibility; double scale_ratio; #endif @@ -85,10 +84,8 @@ static int config(struct vf_instance *vf, #ifdef CONFIG_ASS vf->priv->scale_ratio = (double) d_width / d_height * height / width; - if (vf->priv->renderer_realaspect) { - mp_ass_configure(vf->priv->renderer_realaspect, vf->opts, width, height, - vf->default_caps & VFCAP_EOSD_UNSCALED); - mp_ass_configure(vf->priv->renderer_vsfilter, vf->opts, width, height, + if (vf->priv->renderer) { + mp_ass_configure(vf->priv->renderer, vf->opts, width, height, vf->default_caps & VFCAP_EOSD_UNSCALED); } @@ -137,16 +134,10 @@ static int control(struct vf_instance *vf, int request, void* data) #ifdef CONFIG_ASS case VFCTRL_INIT_EOSD: { - vf->priv->renderer_realaspect = ass_renderer_init(data); - if (!vf->priv->renderer_realaspect) - return CONTROL_FALSE; - vf->priv->renderer_vsfilter = ass_renderer_init(data); - if (!vf->priv->renderer_vsfilter) { - ass_renderer_done(vf->priv->renderer_realaspect); + vf->priv->renderer = ass_renderer_init(data); + if (!vf->priv->renderer) return CONTROL_FALSE; - } - mp_ass_configure_fonts(vf->priv->renderer_realaspect); - mp_ass_configure_fonts(vf->priv->renderer_vsfilter); + mp_ass_configure_fonts(vf->priv->renderer); vf->priv->prev_visibility = false; return CONTROL_TRUE; } @@ -154,13 +145,11 @@ static int control(struct vf_instance *vf, int request, void* data) { struct osd_state *osd = data; mp_eosd_images_t images = {NULL, 2}; - ASS_Renderer *renderer; + ASS_Renderer *renderer = vf->priv->renderer; double scale; if (osd->vsfilter_aspect && vf->opts->ass_vsfilter_aspect_compat) { - renderer = vf->priv->renderer_vsfilter; scale = vf->priv->scale_ratio; } else { - renderer = vf->priv->renderer_realaspect; scale = 1; } if (!video_out->config_ok || !renderer) @@ -176,10 +165,8 @@ static int control(struct vf_instance *vf, int request, void* data) ass_set_aspect_ratio(renderer, scale, 1); } - if (osd->ass_force_reload) { - mp_ass_reload_options(vf->priv->renderer_realaspect, vf->opts); - mp_ass_reload_options(vf->priv->renderer_vsfilter, vf->opts); - } + if (osd->ass_force_reload) + mp_ass_reload_options(vf->priv->renderer, vf->opts); images.imgs = ass_render_frame(renderer, osd->ass_track, (osd->pts+sub_delay) * 1000 + .5, &images.changed); @@ -252,10 +239,8 @@ static void uninit(struct vf_instance *vf) * to get rid of numbered-mpi references that will now be invalid. */ vo_seek_reset(video_out); #ifdef CONFIG_ASS - if (vf->priv->renderer_realaspect) { - ass_renderer_done(vf->priv->renderer_realaspect); - ass_renderer_done(vf->priv->renderer_vsfilter); - } + if (vf->priv->renderer) + ass_renderer_done(vf->priv->renderer); #endif free(vf->priv); } |