Entries

スポンサーサイト

上記の広告は1ヶ月以上更新のないブログに表示されています。
新しい記事を書く事で広告が消せます。
この記事に対してトラックバックを送信する(FC2ブログユーザー)
http://kovayashi.blog120.fc2.com/tb.php/141-a0a95f08

-件のトラックバック

-件のコメント

コメントの投稿

投稿フォーム
投稿した内容は管理者にだけ閲覧出来ます

iPhone縦で撮ったmovをffmpegで処理すると横倒しになっちゃう。

iPhone縦で撮ったmovをffmpegで処理すると横倒しになっちゃう。これは、movのtkhadのmatorixって情報が透過されないのが原因。ffmpegだけでなくOpen-CVも同じ。

で、そのマトリックスを透過させるには、これはもうffmpegそのものに手をいれなきゃならない。赤が追加青が削除
(1) libavformat/avformat.h

typedef struct AVStream {
.
.
.
int display_matrix[3][3];//追記
} AVStream;

(2)libavformat/mov.c

// for (i = 0; i < 3; i++) {
// display_matrix[i][0] = get_be32(pb); // 16.16 fixed point
// display_matrix[i][1] = get_be32(pb); // 16.16 fixed point
// get_be32(pb); // 2.30 fixed point (not used)
// }


//上記を以下に改造。

for (i = 0; i < 3; i++) {
st->display_matrix[i][0] = display_matrix[i][0] = get_be32(pb); // 16.16 fixed point
st->display_matrix[i][1] = display_matrix[i][1] = get_be32(pb); // 16.16 fixed point
st->display_matrix[i][2] = get_be32(pb); // 16.16 fixed point
}


(3)libavformat/utils.c

AVStream *av_new_stream(AVFormatContext *s, int id)
{
.
.
.
//追記
st->display_matrix[0][0]=0x00010000;
st->display_matrix[0][1]=0x0;
st->display_matrix[0][2]=0x0;
st->display_matrix[1][0]=0x0;
st->display_matrix[1][1]=0x00010000;
st->display_matrix[1][2]=0x0;
st->display_matrix[2][0]=0x0;
st->display_matrix[2][1]=0x0;
st->display_matrix[2][2]=0x40000000;


(4)libavformat/movenc.c

// /* Matrix structure */
// put_be32(pb, 0x00010000); /* reserved */
// put_be32(pb, 0x0); /* reserved */
// put_be32(pb, 0x0); /* reserved */
// put_be32(pb, 0x0); /* reserved */
// put_be32(pb, 0x00010000); /* reserved */
// put_be32(pb, 0x0); /* reserved */
// put_be32(pb, 0x0); /* reserved */
// put_be32(pb, 0x0); /* reserved */
// put_be32(pb, 0x40000000); /* reserved */


//上記を以下に改造

/* Matrix structure */
put_be32(pb,st->display_matrix[0][0]);
put_be32(pb,st->display_matrix[0][1]);
put_be32(pb,st->display_matrix[0][2]);
put_be32(pb,st->display_matrix[1][0]);
put_be32(pb,st->display_matrix[1][1]);
put_be32(pb,st->display_matrix[1][2]);
put_be32(pb,st->display_matrix[2][0]);
put_be32(pb,st->display_matrix[2][1]);
put_be32(pb,st->display_matrix[2][2]);


で、ライブラリを使ってる側で

for(i=0;i<3;i++)
for(j=0;j<3;j++)
vstream->display_matrix[i][j] = formatCtx->streams[videoStream]->display_matrix[i][j];

のようにコピーしてやる。コピーしなきゃ、今までと同じ動作。

コマンドラインのffmpegでもなんとかしたいなら、ffmpeg.cの中のどこかで、インプットストリームからアウトストリームへのコピーを行えば良いのだろうけど、それは個人的には必要じゃないので見送り。けっこう大変そう。
この記事に対してトラックバックを送信する(FC2ブログユーザー)
http://kovayashi.blog120.fc2.com/tb.php/141-a0a95f08

0件のトラックバック

0件のコメント

コメントの投稿

投稿フォーム
投稿した内容は管理者にだけ閲覧出来ます

Appendix

プロフィール

kovayashi

Author:kovayashi
・嫌いなもの
 →好きなもの

・インストール
 →バンドル
・バックアップ
 →アップロード
・努力
 →チート

最近のトラックバック

ブログ内検索

上記広告は1ヶ月以上更新のないブログに表示されています。新しい記事を書くことで広告を消せます。