[FFmpeg-cvslog] tests/fate-run: Always overwrite output files for md5 tests
ffmpeg | branch: master | Andreas Rheinhardt | Sun Sep 20 16:39:59 2020 +0200| [e575d59afe928af7729cc8abed94cc100c991444] | committer: Andreas Rheinhardt tests/fate-run: Always overwrite output files for md5 tests Otherwise the result of such tests will not accurately reflect the current state. Reviewed-by: Jan Ekström Signed-off-by: Andreas Rheinhardt > http://git.videolan.org/gitweb.cgi/ffmpeg.git/?a=commit;h=e575d59afe928af7729cc8abed94cc100c991444 --- tests/fate-run.sh | 2 +- 1 file changed, 1 insertion(+), 1 deletion(-) diff --git a/tests/fate-run.sh b/tests/fate-run.sh index 1b283e9c35..58d5fdbb60 100755 --- a/tests/fate-run.sh +++ b/tests/fate-run.sh @@ -158,7 +158,7 @@ md5pipe(){ md5(){ encfile="${outdir}/${test}.out" cleanfiles="$cleanfiles $encfile" -ffmpeg "$@" $(target_path $encfile) +ffmpeg -y "$@" $(target_path $encfile) do_md5sum $encfile | awk '{print $1}' } ___ ffmpeg-cvslog mailing list ffmpeg-cvslog@ffmpeg.org https://ffmpeg.org/mailman/listinfo/ffmpeg-cvslog To unsubscribe, visit link above, or email ffmpeg-cvslog-requ...@ffmpeg.org with subject "unsubscribe".
[FFmpeg-cvslog] avcodec: add Argonaut Games Video decoder
ffmpeg | branch: master | Paul B Mahol | Fri Sep 18 17:43:42 2020 +0200| [a3a6b56200e2899769175291837a178f20e1e95a] | committer: Paul B Mahol avcodec: add Argonaut Games Video decoder > http://git.videolan.org/gitweb.cgi/ffmpeg.git/?a=commit;h=a3a6b56200e2899769175291837a178f20e1e95a --- Changelog | 1 + libavcodec/Makefile | 1 + libavcodec/allcodecs.c | 1 + libavcodec/argo.c | 740 libavcodec/codec_desc.c | 7 + libavcodec/codec_id.h | 1 + libavcodec/version.h| 2 +- libavformat/argo_brp.c | 15 +- 8 files changed, 754 insertions(+), 14 deletions(-) diff --git a/Changelog b/Changelog index 93beec3720..358cbaaf94 100644 --- a/Changelog +++ b/Changelog @@ -29,6 +29,7 @@ version : - aax demuxer - IPU decoder, parser and demuxer - Intel QSV-accelerated AV1 decoding +- Argonaut Games Video decoder version 4.3: diff --git a/libavcodec/Makefile b/libavcodec/Makefile index bee2335a5a..816d87ba60 100644 --- a/libavcodec/Makefile +++ b/libavcodec/Makefile @@ -210,6 +210,7 @@ OBJS-$(CONFIG_APTX_HD_ENCODER) += aptxenc.o aptx.o OBJS-$(CONFIG_APNG_DECODER)+= png.o pngdec.o pngdsp.o OBJS-$(CONFIG_APNG_ENCODER)+= png.o pngenc.o OBJS-$(CONFIG_ARBC_DECODER)+= arbc.o +OBJS-$(CONFIG_ARGO_DECODER)+= argo.o OBJS-$(CONFIG_SSA_DECODER) += assdec.o ass.o OBJS-$(CONFIG_SSA_ENCODER) += assenc.o ass.o OBJS-$(CONFIG_ASS_DECODER) += assdec.o ass.o diff --git a/libavcodec/allcodecs.c b/libavcodec/allcodecs.c index 26fe90eafb..2b580b66cf 100644 --- a/libavcodec/allcodecs.c +++ b/libavcodec/allcodecs.c @@ -43,6 +43,7 @@ extern AVCodec ff_ansi_decoder; extern AVCodec ff_apng_encoder; extern AVCodec ff_apng_decoder; extern AVCodec ff_arbc_decoder; +extern AVCodec ff_argo_decoder; extern AVCodec ff_asv1_encoder; extern AVCodec ff_asv1_decoder; extern AVCodec ff_asv2_encoder; diff --git a/libavcodec/argo.c b/libavcodec/argo.c new file mode 100644 index 00..6b4d449935 --- /dev/null +++ b/libavcodec/argo.c @@ -0,0 +1,740 @@ +/* + * Argonaut Games Video decoder + * Copyright (c) 2020 Paul B Mahol + * + * This file is part of FFmpeg. + * + * FFmpeg 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. + * + * FFmpeg 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 FFmpeg; if not, write to the Free Software + * Foundation, Inc., 51 Franklin Street, Fifth Floor, Boston, MA 02110-1301 USA + */ + +#include +#include +#include + +#include "libavutil/imgutils.h" +#include "libavutil/internal.h" +#include "libavutil/intreadwrite.h" +#include "libavutil/mem.h" + +#include "avcodec.h" +#include "bytestream.h" +#include "internal.h" + +typedef struct ArgoContext { +GetByteContext gb; + +int bpp; +int key; +int mv0[128][2]; +int mv1[16][2]; +uint32_t pal[256]; +AVFrame *frame; +} ArgoContext; + +static int decode_pal8(AVCodecContext *avctx, uint32_t *pal) +{ +ArgoContext *s = avctx->priv_data; +GetByteContext *gb = &s->gb; +int start, count; + +start = bytestream2_get_le16(gb); +count = bytestream2_get_le16(gb); + +if (start + count > 256) +return AVERROR_INVALIDDATA; + +if (bytestream2_get_bytes_left(gb) < 3 * count) +return AVERROR_INVALIDDATA; + +for (int i = 0; i < count; i++) +pal[start + i] = (0xFF << 24U) | bytestream2_get_be24u(gb); + +return 0; +} + +static int decode_avcf(AVCodecContext *avctx, AVFrame *frame) +{ +ArgoContext *s = avctx->priv_data; +GetByteContext *gb = &s->gb; +const int l = frame->linesize[0]; +const uint8_t *map = gb->buffer; +uint8_t *dst = frame->data[0]; + +if (bytestream2_get_bytes_left(gb) < 1024 + (frame->width / 2) * (frame->height / 2)) +return AVERROR_INVALIDDATA; + +bytestream2_skipu(gb, 1024); +for (int y = 0; y < frame->height; y += 2) { +for (int x = 0; x < frame->width; x += 2) { +int index = bytestream2_get_byteu(gb); +const uint8_t *block = map + index * 4; + +dst[x+0] = block[0]; +dst[x+1] = block[1]; +dst[x+l] = block[2]; +dst[x+l+1] = block[3]; +} + +dst += frame->linesize[0] * 2; +} + +return 0; +} + +static int decode_alcd(AVCodecContext *avctx, AVFrame *frame) +{ +ArgoContext *s = avctx->priv_data; +GetByteContext *gb = &s->gb; +GetByteContext sb; +const int l
[FFmpeg-cvslog] vf_colorspace: Added linear trc.
ffmpeg | branch: master | Andrew Klaassen | Thu Sep 24 15:00:52 2020 -0400| [a6e72fb46d0601d0fcf44c93c32dd472599b5984] | committer: Ronald S. Bultje vf_colorspace: Added linear trc. This patch adds the coefficients for the linear gamma function (1,0,1,0) to the colorspace filter. Signed-off-by: Andrew Klaassen Signed-off-by: Ronald S. Bultje > http://git.videolan.org/gitweb.cgi/ffmpeg.git/?a=commit;h=a6e72fb46d0601d0fcf44c93c32dd472599b5984 --- libavfilter/vf_colorspace.c | 2 ++ 1 file changed, 2 insertions(+) diff --git a/libavfilter/vf_colorspace.c b/libavfilter/vf_colorspace.c index 34f13d9d3c..39af74c221 100644 --- a/libavfilter/vf_colorspace.c +++ b/libavfilter/vf_colorspace.c @@ -179,6 +179,7 @@ static const struct TransferCharacteristics transfer_characteristics[AVCOL_TRC_N [AVCOL_TRC_GAMMA28] = { 1.0,0.0,1.0 / 2.8, 0.0 }, [AVCOL_TRC_SMPTE170M] = { 1.099, 0.018, 0.45, 4.5 }, [AVCOL_TRC_SMPTE240M] = { 1.1115, 0.0228, 0.45, 4.0 }, +[AVCOL_TRC_LINEAR]= { 1.0,0.0,1.0, 0.0 }, [AVCOL_TRC_IEC61966_2_1] = { 1.055, 0.0031308, 1.0 / 2.4, 12.92 }, [AVCOL_TRC_IEC61966_2_4] = { 1.099, 0.018, 0.45, 4.5 }, [AVCOL_TRC_BT2020_10] = { 1.099, 0.018, 0.45, 4.5 }, @@ -990,6 +991,7 @@ static const AVOption colorspace_options[] = { ENUM("gamma28", AVCOL_TRC_GAMMA28, "trc"), ENUM("smpte170m",AVCOL_TRC_SMPTE170M,"trc"), ENUM("smpte240m",AVCOL_TRC_SMPTE240M,"trc"), +ENUM("linear", AVCOL_TRC_LINEAR, "trc"), ENUM("srgb", AVCOL_TRC_IEC61966_2_1, "trc"), ENUM("iec61966-2-1", AVCOL_TRC_IEC61966_2_1, "trc"), ENUM("xvycc",AVCOL_TRC_IEC61966_2_4, "trc"), ___ ffmpeg-cvslog mailing list ffmpeg-cvslog@ffmpeg.org https://ffmpeg.org/mailman/listinfo/ffmpeg-cvslog To unsubscribe, visit link above, or email ffmpeg-cvslog-requ...@ffmpeg.org with subject "unsubscribe".
[FFmpeg-cvslog] avfilter/vf_v360: add octahedron format
ffmpeg | branch: master | Paul B Mahol | Sun Sep 27 22:33:05 2020 +0200| [6db1b1af4c93c98c31e8f2dc546647d77c0bdb5f] | committer: Paul B Mahol avfilter/vf_v360: add octahedron format > http://git.videolan.org/gitweb.cgi/ffmpeg.git/?a=commit;h=6db1b1af4c93c98c31e8f2dc546647d77c0bdb5f --- doc/filters.texi | 3 ++ libavfilter/v360.h| 1 + libavfilter/vf_v360.c | 99 +++ 3 files changed, 103 insertions(+) diff --git a/doc/filters.texi b/doc/filters.texi index 06572218b8..f072a84424 100644 --- a/doc/filters.texi +++ b/doc/filters.texi @@ -19511,6 +19511,9 @@ Set input horizontal/vertical/diagonal field of view. Values in degrees. If diagonal field of view is set it overrides horizontal and vertical field of view. @end table + +@item octahedron +Octahedron projection. @end table @item interp diff --git a/libavfilter/v360.h b/libavfilter/v360.h index 7fbbecf691..851bbcb8d8 100644 --- a/libavfilter/v360.h +++ b/libavfilter/v360.h @@ -53,6 +53,7 @@ enum Projections { HEQUIRECTANGULAR, EQUISOLID, ORTHOGRAPHIC, +OCTAHEDRON, NB_PROJECTIONS, }; diff --git a/libavfilter/vf_v360.c b/libavfilter/vf_v360.c index c021724fa3..f3d269ecde 100644 --- a/libavfilter/vf_v360.c +++ b/libavfilter/vf_v360.c @@ -83,6 +83,7 @@ static const AVOption v360_options[] = { {"he", "half equirectangular", 0, AV_OPT_TYPE_CONST, {.i64=HEQUIRECTANGULAR},0, 0, FLAGS, "in" }, { "equisolid", "equisolid", 0, AV_OPT_TYPE_CONST, {.i64=EQUISOLID}, 0, 0, FLAGS, "in" }, {"og", "orthographic", 0, AV_OPT_TYPE_CONST, {.i64=ORTHOGRAPHIC},0, 0, FLAGS, "in" }, +{"octahedron", "octahedron", 0, AV_OPT_TYPE_CONST, {.i64=OCTAHEDRON}, 0, 0, FLAGS, "in" }, {"output", "set output projection",OFFSET(out), AV_OPT_TYPE_INT,{.i64=CUBEMAP_3_2}, 0,NB_PROJECTIONS-1, FLAGS, "out" }, { "e", "equirectangular",0, AV_OPT_TYPE_CONST, {.i64=EQUIRECTANGULAR}, 0, 0, FLAGS, "out" }, { "equirect", "equirectangular",0, AV_OPT_TYPE_CONST, {.i64=EQUIRECTANGULAR}, 0, 0, FLAGS, "out" }, @@ -112,6 +113,7 @@ static const AVOption v360_options[] = { {"he", "half equirectangular", 0, AV_OPT_TYPE_CONST, {.i64=HEQUIRECTANGULAR},0, 0, FLAGS, "out" }, { "equisolid", "equisolid", 0, AV_OPT_TYPE_CONST, {.i64=EQUISOLID}, 0, 0, FLAGS, "out" }, {"og", "orthographic", 0, AV_OPT_TYPE_CONST, {.i64=ORTHOGRAPHIC},0, 0, FLAGS, "out" }, +{"octahedron", "octahedron", 0, AV_OPT_TYPE_CONST, {.i64=OCTAHEDRON}, 0, 0, FLAGS, "out" }, {"interp", "set interpolation method", OFFSET(interp), AV_OPT_TYPE_INT,{.i64=BILINEAR},0, NB_INTERP_METHODS-1, FLAGS, "interp" }, { "near", "nearest neighbour", 0, AV_OPT_TYPE_CONST, {.i64=NEAREST}, 0, 0, FLAGS, "interp" }, { "nearest", "nearest neighbour", 0, AV_OPT_TYPE_CONST, {.i64=NEAREST}, 0, 0, FLAGS, "interp" }, @@ -3747,6 +3749,91 @@ static int xyz_to_tspyramid(const V360Context *s, return 1; } +/** + * Calculate 3D coordinates on sphere for corresponding frame position in octahedron format. + * + * @param s filter private context + * @param i horizontal position on frame [0, width) + * @param j vertical position on frame [0, height) + * @param width frame width + * @param height frame height + * @param vec coordinates on sphere + */ +static int octahedron_to_xyz(const V360Context *s, + int i, int j, int width, int height, + float *vec) +{ +float x = ((i + 0.5f) / width) * 2.f - 1.f; +float y = ((j + 0.5f) / height) * 2.f - 1.f; +float ax = fabsf(x); +float ay = fabsf(y); + +vec[2] = 1.f - (ax + ay); +if (ax + ay > 1.f) { +vec[0] = (1.f - ay) * FFSIGN(x); +vec[1] = (1.f - ax) * FFSIGN(y); +} else { +vec[0] = x; +vec[1] = y; +} + +normalize_vector(vec); + +return 1; +} + +/** + * Calculate frame position in octahedron format for corresponding 3D coordinates on sphere. + * + * @param s filter private context + * @param vec coordinates on sphere + * @param width frame width + * @param height frame height + * @param us horizontal coordinates for interpolation window + * @param vs vertical coordinates for interpolation window + * @param du horizontal relat
[FFmpeg-cvslog] examples/muxing: misc style fixes
ffmpeg | branch: master | Jun Zhao | Fri Sep 25 19:23:54 2020 +0800| [ef868fa4a1e2803e22382ca907ebb384867f82b6] | committer: Jun Zhao examples/muxing: misc style fixes misc style fixes. Reviewed-by: Steven Liu Signed-off-by: Jun Zhao > http://git.videolan.org/gitweb.cgi/ffmpeg.git/?a=commit;h=ef868fa4a1e2803e22382ca907ebb384867f82b6 --- doc/examples/muxing.c | 47 +++ 1 file changed, 23 insertions(+), 24 deletions(-) diff --git a/doc/examples/muxing.c b/doc/examples/muxing.c index bd16486a24..42f704c258 100644 --- a/doc/examples/muxing.c +++ b/doc/examples/muxing.c @@ -200,7 +200,7 @@ static void add_stream(OutputStream *ost, AVFormatContext *oc, * the motion of the chroma plane does not match the luma plane. */ c->mb_decision = 2; } -break; +break; default: break; @@ -284,25 +284,25 @@ static void open_audio(AVFormatContext *oc, AVCodec *codec, OutputStream *ost, A } /* create resampler context */ -ost->swr_ctx = swr_alloc(); -if (!ost->swr_ctx) { -fprintf(stderr, "Could not allocate resampler context\n"); -exit(1); -} +ost->swr_ctx = swr_alloc(); +if (!ost->swr_ctx) { +fprintf(stderr, "Could not allocate resampler context\n"); +exit(1); +} -/* set options */ -av_opt_set_int (ost->swr_ctx, "in_channel_count", c->channels, 0); -av_opt_set_int (ost->swr_ctx, "in_sample_rate", c->sample_rate,0); -av_opt_set_sample_fmt(ost->swr_ctx, "in_sample_fmt", AV_SAMPLE_FMT_S16, 0); -av_opt_set_int (ost->swr_ctx, "out_channel_count", c->channels, 0); -av_opt_set_int (ost->swr_ctx, "out_sample_rate", c->sample_rate,0); -av_opt_set_sample_fmt(ost->swr_ctx, "out_sample_fmt", c->sample_fmt, 0); - -/* initialize the resampling context */ -if ((ret = swr_init(ost->swr_ctx)) < 0) { -fprintf(stderr, "Failed to initialize the resampling context\n"); -exit(1); -} +/* set options */ +av_opt_set_int (ost->swr_ctx, "in_channel_count", c->channels, 0); +av_opt_set_int (ost->swr_ctx, "in_sample_rate", c->sample_rate, 0); +av_opt_set_sample_fmt(ost->swr_ctx, "in_sample_fmt", AV_SAMPLE_FMT_S16, 0); +av_opt_set_int (ost->swr_ctx, "out_channel_count", c->channels, 0); +av_opt_set_int (ost->swr_ctx, "out_sample_rate",c->sample_rate, 0); +av_opt_set_sample_fmt(ost->swr_ctx, "out_sample_fmt", c->sample_fmt, 0); + +/* initialize the resampling context */ +if ((ret = swr_init(ost->swr_ctx)) < 0) { +fprintf(stderr, "Failed to initialize the resampling context\n"); +exit(1); +} } /* Prepare a 16 bit dummy audio frame of 'frame_size' samples and @@ -349,10 +349,10 @@ static int write_audio_frame(AVFormatContext *oc, OutputStream *ost) if (frame) { /* convert samples from native format to destination codec format, using the resampler */ -/* compute destination number of samples */ -dst_nb_samples = av_rescale_rnd(swr_get_delay(ost->swr_ctx, c->sample_rate) + frame->nb_samples, -c->sample_rate, c->sample_rate, AV_ROUND_UP); -av_assert0(dst_nb_samples == frame->nb_samples); +/* compute destination number of samples */ +dst_nb_samples = av_rescale_rnd(swr_get_delay(ost->swr_ctx, c->sample_rate) + frame->nb_samples, +c->sample_rate, c->sample_rate, AV_ROUND_UP); +av_assert0(dst_nb_samples == frame->nb_samples); /* when we pass a frame to the encoder, it may keep a reference to it * internally; @@ -519,7 +519,6 @@ static AVFrame *get_video_frame(OutputStream *ost) static int write_video_frame(AVFormatContext *oc, OutputStream *ost) { return write_frame(oc, ost->enc, ost->st, get_video_frame(ost)); - } static void close_stream(AVFormatContext *oc, OutputStream *ost) ___ ffmpeg-cvslog mailing list ffmpeg-cvslog@ffmpeg.org https://ffmpeg.org/mailman/listinfo/ffmpeg-cvslog To unsubscribe, visit link above, or email ffmpeg-cvslog-requ...@ffmpeg.org with subject "unsubscribe".
[FFmpeg-cvslog] lavf/hls: add AC-3/EAC-3 to allowed extensions file list
ffmpeg | branch: master | Jun Zhao | Fri Sep 25 19:52:14 2020 +0800| [5bf22519cec50cceada06bb58a9d1fa2bb30d1ec] | committer: Jun Zhao lavf/hls: add AC-3/EAC-3 to allowed extensions file list Add AC-3/EAC-3 to allowed extensions file list. From HTTP Live Streaming 2nd Edition draft-pantos-hls-rfc8216bis-07 section 3.1.3.Packed Audio, HLS demuxer need to support MP3/AC-3/EAC-3. Reviewd-by: Steven Liu Signed-off-by: Jun Zhao > http://git.videolan.org/gitweb.cgi/ffmpeg.git/?a=commit;h=5bf22519cec50cceada06bb58a9d1fa2bb30d1ec --- libavformat/hls.c | 2 +- 1 file changed, 1 insertion(+), 1 deletion(-) diff --git a/libavformat/hls.c b/libavformat/hls.c index f33ff3f645..72e28ab94f 100644 --- a/libavformat/hls.c +++ b/libavformat/hls.c @@ -2371,7 +2371,7 @@ static const AVOption hls_options[] = { OFFSET(live_start_index), AV_OPT_TYPE_INT, {.i64 = -3}, INT_MIN, INT_MAX, FLAGS}, {"allowed_extensions", "List of file extensions that hls is allowed to access", OFFSET(allowed_extensions), AV_OPT_TYPE_STRING, -{.str = "3gp,aac,avi,flac,mkv,m3u8,m4a,m4s,m4v,mpg,mov,mp2,mp3,mp4,mpeg,mpegts,ogg,ogv,oga,ts,vob,wav"}, +{.str = "3gp,aac,avi,ac3,eac3,flac,mkv,m3u8,m4a,m4s,m4v,mpg,mov,mp2,mp3,mp4,mpeg,mpegts,ogg,ogv,oga,ts,vob,wav"}, INT_MIN, INT_MAX, FLAGS}, {"max_reload", "Maximum number of times a insufficient list is attempted to be reloaded", OFFSET(max_reload), AV_OPT_TYPE_INT, {.i64 = 1000}, 0, INT_MAX, FLAGS}, ___ ffmpeg-cvslog mailing list ffmpeg-cvslog@ffmpeg.org https://ffmpeg.org/mailman/listinfo/ffmpeg-cvslog To unsubscribe, visit link above, or email ffmpeg-cvslog-requ...@ffmpeg.org with subject "unsubscribe".
[FFmpeg-cvslog] avfilter/setparams: add FF_FILTER_FLAG_HWFRAME_AWARE
ffmpeg | branch: master | Pavel Koshevoy | Mon Sep 21 21:40:27 2020 -0600| [5bbf58ab876279ca1a5a2f30563f271c99b93e62] | committer: Pavel Koshevoy avfilter/setparams: add FF_FILTER_FLAG_HWFRAME_AWARE Allow setparams to be used with hw backed frames and avoid an assertion failure in avfilter_config_links. > http://git.videolan.org/gitweb.cgi/ffmpeg.git/?a=commit;h=5bbf58ab876279ca1a5a2f30563f271c99b93e62 --- libavfilter/vf_setparams.c | 3 +++ 1 file changed, 3 insertions(+) diff --git a/libavfilter/vf_setparams.c b/libavfilter/vf_setparams.c index 689097fac0..72a69e3fc2 100644 --- a/libavfilter/vf_setparams.c +++ b/libavfilter/vf_setparams.c @@ -169,6 +169,7 @@ AVFilter ff_vf_setparams = { .priv_class = &setparams_class, .inputs = inputs, .outputs = outputs, +.flags_internal = FF_FILTER_FLAG_HWFRAME_AWARE, }; #if CONFIG_SETRANGE_FILTER @@ -208,6 +209,7 @@ AVFilter ff_vf_setrange = { .priv_class = &setrange_class, .inputs = inputs, .outputs = outputs, +.flags_internal = FF_FILTER_FLAG_HWFRAME_AWARE, }; #endif /* CONFIG_SETRANGE_FILTER */ @@ -242,5 +244,6 @@ AVFilter ff_vf_setfield = { .priv_class = &setfield_class, .inputs = inputs, .outputs = outputs, +.flags_internal = FF_FILTER_FLAG_HWFRAME_AWARE, }; #endif /* CONFIG_SETFIELD_FILTER */ ___ ffmpeg-cvslog mailing list ffmpeg-cvslog@ffmpeg.org https://ffmpeg.org/mailman/listinfo/ffmpeg-cvslog To unsubscribe, visit link above, or email ffmpeg-cvslog-requ...@ffmpeg.org with subject "unsubscribe".