[FFmpeg-devel] [PATCH] Enables parsing DVD color palette directly from IFO file
Michael Niedermayer
michaelni at gmx.at
Tue Nov 11 18:20:26 CET 2014
On Tue, Nov 11, 2014 at 11:41:53PM +0900, TOYAMA Shin-ichi wrote:
> Nicolas George wrote in <20141110140122.GA22517 at phare.normalesup.org>
> >Thanks for the patch. See comments below.
>
> O.K. I've finished to revise the patch.
> Please see attached.
>
> >The update for the documentation is missing.
>
> Added short description to doc/decoders.texi.
>
> >> + if (strncmp(p, "ifo:", 4) == 0) {
> >
> >This can be discussed, but I would prefer having a separate -ifo_file
> >option.
>
> I agree. Separated to -use_ifo_palette option.
>
> Hendrik Leppkes wrote in <CA+anqdwL+Q+y9vE_VGMBNAks3W8LBTaAzQETvJPEOQFSxWisCw at mail.gmail.com>
> >We have conversion macros for those, see yuv_a_to_rgba at the beginning of
> >the same file.
> >In fact, if you just read all the YCbCr stuff into a fixed-size buffer
> >first, you might even be able to use the same function for the entire
> >conversion.
>
> Thanks! Those macros worked fine in my function.
>
> --
> TOYAMA Shin-ichi mailto:shin1 at wmail.plala.or.jp
> doc/decoders.texi | 3 ++
> libavcodec/dvdsubdec.c | 54 +++++++++++++++++++++++++++++++++++++++++++++++++
> 2 files changed, 57 insertions(+)
> 49de4f371beafc9e48cf5f386096b673777d87b0 0001-New-option-for-obtaining-global-palette-from-.IFO-file.patch
> From 09d6fe89be1815fec7a71f355ded46a1b40d0ade Mon Sep 17 00:00:00 2001
> From: Shin-ichi Toyama <shin1 at wmail.plala.or.jp>
> Date: Tue, 11 Nov 2014 23:02:10 +0900
> Subject: [PATCH] New option for obtaining global palette from .IFO file
>
> ---
> doc/decoders.texi | 3 +++
> libavcodec/dvdsubdec.c | 54 ++++++++++++++++++++++++++++++++++++++++++++++++++
> 2 files changed, 57 insertions(+)
>
> diff --git a/doc/decoders.texi b/doc/decoders.texi
> index ae20cea..02ff475 100644
> --- a/doc/decoders.texi
> +++ b/doc/decoders.texi
> @@ -191,6 +191,9 @@ numbers (without 0x prefix) separated by comas, for example @code{0d00ee,
> ee450d, 101010, eaeaea, 0ce60b, ec14ed, ebff0b, 0d617a, 7b7b7b, d1d1d1,
> 7b2a0e, 0d950c, 0f007b, cf0dec, cfa80c, 7c127b}.
>
> + at item use_ifo_palette
> +Specify the the IFO file from which the global palette is obtained.
> +
> @item forced_subs_only
> Only decode subtitle entries marked as forced. Some titles have forced
> and non-forced subtitles in the same track. Setting this flag to @code{1}
> diff --git a/libavcodec/dvdsubdec.c b/libavcodec/dvdsubdec.c
> index bb28d9e..5981c37 100644
> --- a/libavcodec/dvdsubdec.c
> +++ b/libavcodec/dvdsubdec.c
> @@ -28,12 +28,14 @@
> #include "libavutil/opt.h"
> #include "libavutil/imgutils.h"
> #include "libavutil/avstring.h"
> +#include "libavutil/bswap.h"
>
> typedef struct DVDSubContext
> {
> AVClass *class;
> uint32_t palette[16];
> char *palette_str;
> + char *ifo_str;
> int has_palette;
> uint8_t colormap[4];
> uint8_t alpha[256];
> @@ -583,6 +585,55 @@ static void parse_palette(DVDSubContext *ctx, char *p)
> }
> }
>
> +static void parse_ifo_palette(DVDSubContext *ctx, char *p)
> +{
> + FILE *in;
> + char ifostr[12];
> + uint32_t sp_pgci, pgci, off_pgc, pgc;
> + uint8_t yuv[16][4], r, g, b;
> + int i, y, cb, cr;
> + int r_add, g_add, b_add;
> + const uint8_t *cm = ff_crop_tab + MAX_NEG_CROP;
> +
> + ctx->has_palette = 0;
> + if ((in = fopen(p, "r")) == NULL) {
why does this not use avio_open2() ?
this would permit to also use ifo files in other locations than
local files
> + av_log(NULL, AV_LOG_WARNING, "[dvdsubdec.c] Failed to open IFO file \"%s\": %s\n", p, strerror(errno));
> + return;
> + }
> + fread(ifostr, 12, 1, in);
> + if (strncmp (ifostr, "DVDVIDEO-VTS", 12) != 0){
> + av_log(NULL, AV_LOG_WARNING, "[dvdsubdec.c] \"%s\" is not a proper IFO file\n", p);
> + return;
> + }
> + fseek(in, 0xCC, SEEK_SET);
> + if (fread(&sp_pgci, 4, 1, in) == 1) {
> + pgci = av_be2ne32(sp_pgci) * 2048;
> + fprintf(stderr, "position of off_pgc = %d\n", pgci + 0x0C);
should use av_log()
> + fseek(in, pgci + 0x0C, SEEK_SET);
> + if (fread(&off_pgc, 4, 1, in) == 1) {
> + pgc = pgci + av_be2ne32(off_pgc);
> + fprintf(stderr, "palette position = %d\n", pgc + 0xA4);
> + fseek(in, pgc + 0xA4, SEEK_SET);
> + if (fread(yuv, sizeof(yuv), 1, in) == 1){
> + ctx->has_palette = 1;
> + for(i=0;i<16;i++) {
> + y = yuv[i][1];
> + cr = yuv[i][2];
> + cb = yuv[i][3];
> + YUV_TO_RGB1_CCIR(cb, cr);
> + YUV_TO_RGB2_CCIR(r, g, b, y);
> + ctx->palette[i] = (r << 16) + (g << 8) + b;
> + }
> + }
> + }
> + }
> + if (ctx->has_palette == 0) {
> + av_log(NULL, AV_LOG_WARNING, "[dvdsubdec.c] Failed to read palette from IFO file \"%s\"\n", p);
> + }
> + fclose(in);
> + return;
> +}
> +
> static int dvdsub_parse_extradata(AVCodecContext *avctx)
> {
> DVDSubContext *ctx = (DVDSubContext*) avctx->priv_data;
> @@ -631,6 +682,8 @@ static av_cold int dvdsub_init(AVCodecContext *avctx)
> if ((ret = dvdsub_parse_extradata(avctx)) < 0)
> return ret;
>
> + if (ctx->ifo_str)
> + parse_ifo_palette(ctx, ctx->ifo_str);
> if (ctx->palette_str)
> parse_palette(ctx, ctx->palette_str);
> if (ctx->has_palette) {
> @@ -656,6 +709,7 @@ static av_cold int dvdsub_close(AVCodecContext *avctx)
> #define SD AV_OPT_FLAG_SUBTITLE_PARAM | AV_OPT_FLAG_DECODING_PARAM
> static const AVOption options[] = {
> { "palette", "set the global palette", OFFSET(palette_str), AV_OPT_TYPE_STRING, { .str = NULL }, 0, 0, SD },
> + { "use_ifo_palette", "obtain the global palette from .IFO file", OFFSET(ifo_str), AV_OPT_TYPE_STRING, { .str = NULL }, 0, 0, SD },
> { "forced_subs_only", "Only show forced subtitles", OFFSET(forced_subs_only), AV_OPT_TYPE_INT, {.i64 = 0}, 0, 1, SD},
> { NULL }
> };
> --
> 1.8.1.msysgit.1
>
> _______________________________________________
> ffmpeg-devel mailing list
> ffmpeg-devel at ffmpeg.org
> http://ffmpeg.org/mailman/listinfo/ffmpeg-devel
--
Michael GnuPG fingerprint: 9FF2128B147EF6730BADF133611EC787040B0FAB
If you think the mosad wants you dead since a long time then you are either
wrong or dead since a long time.
-------------- next part --------------
A non-text attachment was scrubbed...
Name: not available
Type: application/pgp-signature
Size: 181 bytes
Desc: Digital signature
URL: <https://ffmpeg.org/pipermail/ffmpeg-devel/attachments/20141111/e4f475b7/attachment.asc>
More information about the ffmpeg-devel
mailing list