2012年11月20日火曜日

FineSharpen for VapourSynth

VapourSynth用にFineSharpenを移植してみました。

https://gist.github.com/4111749

avs scriptの移植のサンプルにと考えて、規模的にちょうどよさそうだったのでこれを選んだわけですが、よく考えてみたらRemoveGrain、Repairというavisynthプラグインに依存してしまうので、あまりよくなかったかもしれません。

まあ、「masktoolsの代替をどうするか」の参考くらいにはなるということで。

これで使っているspline()は、こちらの方のものを参考にさせていただきました。
これだけのためにNumpyとか使うわけにもいかんからなぁ…

使い方:
gistからスクリプトをDLして、Python3.x\\Lib\\site-packages以下にfinesharp.pyという名前で保存して下さい。
import vapoursynth as vs
import finesharp

core = vs.Core()
core.std.LoadPlugin('path/to/the/ffms2.dll')
core.std.LoadPlugin('path/to/the/RemoveGrain.dll')
core.std.LoadPlugin('path/to/the/Repair.dll')
fs = finesharp.FineSharp(core)

clip = core.ffms2.Source('path/to/the/video.mp4')
clip = fs.sharpen(clip)
...

ちなみに 'print(fs.usage())' で、sharpen()の説明が読めます。

2012年11月18日日曜日

vsrawsource その3

更新しました。

vsrawsource-0.3.0.7z
https://github.com/chikuzen/vsrawsource

* アルファチャンネルの読み込みに対応
* sarnum/sardenでsarを指定できるように機能追加

VapourSynth-r15以降専用です

vsavsreader その6

更新しました

vsavsreader-79a12496.7z
https://github.com/chikuzen/VS_AvsReader

* アルファチャンネルの読み込みに対応

VapourSynthはr15からAPIバージョンが3にあがりました。
それにあわせてこちらもAPIを上げたので、r15以降でないと動きません。

2012年11月16日金曜日

ある日の会話より

(Chikuzen) Doom9とかにたまに書き込んでる Mr.VacBobってastrange氏だったのか
(JEEB)     いぇす
(JEEB)     http://forum.doom9.org/showpost.php?p=1600803&postcount=501
(JEEB)     I have a new (NIH) resizer project in progress myself, but it's just for thumbnailing
           and not really worth trying to do much else with it.←リサイザー作ってるのか。まぁ、
           libavcodec等にはもうAppleのせいで触れられないんで、何か別のプロジェクトを作るのは時間の
           問題だった 笑
(Chikuzen) あら、あの人appleに就職したの?
(JEEB)     うん
(JEEB)     それであのQT用のlibavcodecうんたらが開発停止になったわけだし
(Chikuzen) なるほど、そーいうことだったのか
(Chikuzen) Perian開発終了はAppleのせいだった!
(JEEB)     あとlibavcodecの-mtに触れられないのもそれが原因だったりw
(Chikuzen) なんだ、最近ffmpeg-mt関連にあの人ほとんど触らなくなったと思ったら
(Chikuzen) GoogleなんかBBB氏を使ってガンガン進めてるのにねぇ
(Chikuzen) やっぱAppleはオープンソースの敵だよ
(JEEB)     オープンソースを敵にもなりそうな相手として扱ってるからねぇ・・・ 「外部で仕事でやった
           ような感じのプログラミングはしちゃダメダメよ(はーと)」という条件が仕事の契約に入ってるw

つくづく俺はAppleは嫌いだよ...

2012年11月2日金曜日

vsimagereader

というわけで(?)、これまで書いた4つの画像入力用プラグインを一つに統合しました。

vsimagereader-0.1.0.7z
https://github.com/chikuzen/vsimagereader

いまのところ、これで読めるのはBMP、JPEG、PNG、TGAの4種類です。
いちおうそこそこ拡張しやすいように書いたつもりなので、ひょっとすると対応フォーマットが増えるかも知れません。
でも、殆どの場合、JPEGとPNGさえ読めれば、あとはどうとでもなるような気がするんですが…JPEG2000とかWebPとか、誰も使ってないでしょ?

なお、旧プラグイン4つはこれを持ちまして開発終了としますので、なにかバグをみつけても直しません。
不具合があった場合は、とりあえずこちらを試してみて、それでもダメだった場合のみ報告をお願いします。

2012年10月29日月曜日

vstgareader

結局libtgaをそのまま使うのは諦めて、コードを一部流用するほかは全部自分で書くことにしました。
まあ、そのほうがビルドしやすいし、使いやすいですからね。

vstgareader-0.1.0.7z
https://github.com/chikuzen/vstgareader

さて、これでBMP,JPEG,PNG,TGAとだいたい揃ってきたので、これらをなんとか一つに統合したいところですが…どうしようかなぁ。

2012年10月25日木曜日

libtga

PNGもなんとかなったので今度はTGAに挑戦です。

TGAを扱うライブラリにはlibtgaとその改造版のlibtga-exがあります。

で、使い方を確認するために、とりあえずこんなのを書いてみました。
/* TARGA2BGR */
#include <stdio.h>
#include <stdlib.h>

#include "tga.h"

typedef struct {
    TGA *tga;
    unsigned char *buff;
} tga_read_t;

int close(const char *msg, tga_read_t *tr, int ret)
{
    fprintf(stderr, "%s\n", msg);
    if (tr->buff) {
        free(tr->buff);
    }

    if (tr->tga) {
        TGAClose(tr->tga);
    }

    return ret;
}

int main(int argc, char **argv)
{
    if (argc < 2) {
        return -1;
    }

    tga_read_t tr = {0};

    tr.tga = TGAOpen(argv[1], "rb");
    if (!tr.tga || tr.tga->last != TGA_OK) {
        return close("TGAOpen failed", &tr, -1);
    }

    if (TGAReadHeader(tr.tga) != TGA_OK) {
        return close("TGAReadHeader failed", &tr, -1);
    }

    fprintf(stderr, "width: %u\n", tr.tga->hdr.width);
    fprintf(stderr, "height: %u\n", tr.tga->hdr.height);
    fprintf(stderr, "depth: %d\n", tr.tga->hdr.depth);
    fprintf(stderr, "alpha: %d\n", tr.tga->hdr.alpha);

    size_t buf_size
         = tr.tga->hdr.width * tr.tga->hdr.height * tr.tga->hdr.depth >> 3;
    tr.buff = malloc(buf_size);
    if (!tr.buff) {
        return close("malloc failed", &tr, -1);
    }

    if (TGAReadScanlines(tr.tga, tr.buff, 0, tr.tga->hdr.height, TGA_BGR)
        != tr.tga->hdr.height) {
        return close("couldn't read all lines\n", &tr, -1);
    }

    char out_name[1024];
    sprintf(out_name, "%s.raw", argv[1]);
    FILE *out = fopen(out_name, "wb");
    if (!out) {
        return close("open output file failed", &tr, -1);
    }
    fwrite(tr.buff, 1, buf_size, out);
    fclose(out);

    return close("finish", &tr, 0);
}

こいつにtgaファイルを食わせてやればBGRなrawデータとして出力するわけですが、試しにtgaではないファイルを食わせるとなぜかクラッシュします。
いちおうTGAReadHeaderのところでチェックはしているみたいなんですが…はて?

で、TGAReadHeaderの部分のコードを読んでみると
int TGAReadHeader (TGA *tga)
{
    tbyte *tmp;

    if (!tga) return 0;
    __TGASeek(tga, 0, SEEK_SET);
    if (tga->off != 0) {
        TGA_ERROR(tga, TGA_SEEK_FAIL);
        return 0;
    }
    /* 中略 */
    return TGA_OK;
}
と問題なしならTGA_OKを返し、問題有りなら0を返すようになっています。
ではTGA_OKの中身は何かとtga.hのほうを読んでみると…
/* error codes */
enum {
    TGA_OK = 0,  /* success */
    TGA_ERROR,
    TGA_OOM,  /* out of memory */
    TGA_OPEN_FAIL,
    TGA_SEEK_FAIL,
    TGA_READ_FAIL,
    TGA_WRITE_FAIL,
    TGA_UNKNOWN_SUB_FORMAT  /* invalid bit depth */
};

TGA_OKが全然OKになってねえよ…そりゃクラッシュもするわ。

なんで誰もこれを直してないんだ?