コグノスケ


link 未来から過去へ表示(*)  link 過去から未来へ表示

link もっと前
2024年12月24日 >>> 2024年12月11日
link もっと後

2024年12月24日

サンタ宇宙へ(2024年)

目次: サンタ

去年(2023年12月24日の日記参照)と同様に、飛行機の位置をリアルタイムに表示するFlightradar24というサービス(サイトへのリンク)にてサンタが出現しました。クリスマス・イブの日にサンタが出現するのは毎年恒例のお約束演出です。私が見たときは南米付近を飛んでいました。

去年までのサンタは表示された対地速度とサンタの位置から計算した速度が全く違っていたので、今年もチェックしてみようと思います。対地速度の表示ですが、今年は従来と異なり速度が変動しています。私が見たときの表示は11,000kts程度(20,000km/h, マッハ16くらい)でした。メチャ速いです、ジェット機なんて目じゃありません。


13:07:00時点の位置(緯度-0.26043度、経度-44.00613度)


13:08:00時点の位置(緯度1.15381度、経度-47.1023度)

去年同様、ある程度の時間をあけ(今回は1分間)でどれくらい進んだか計算します。今回も距離の計算には国土地理院のページを使いました、緯度経度から距離を一発で計算してくれて便利です(サイトへのリンク)。


緯度、経度から距離と方位角を計算(国土地理院のサイト)

2地点間の距離は約378.5km、時間差は60秒から計算すると、対地速度は約22,710km/hです。地上でのマッハ18(ただし、サンタが飛んでいる高さ60,000ftsだとマッハ数はもっと高く出る)です。地球の重力と釣り合って人工衛星になれる速度(第一宇宙速度)が28,400km/hですから、今年のサンタさんは宇宙へ行かんばかりの勢いで疾走しています。

  • 2021年: マッハ2
  • 2022年: マッハ1.3
  • 2023年: マッハ5
  • 2024年: マッハ18

今年は例年と異なり表示速度と進んだ距離から計算した速度が大体合っていました。だんだん改善されているんでしょうか?来年の速度も気になりますので、覚えていたらまた計算してみましょう。

編集者:すずき(2024/12/25 18:55)

コメント一覧

  • コメントはありません。
open/close この記事にコメントする



2024年12月13日

nvJPEGとNVJPGとJetson APIその6 - Jetson Linux API JPEG encode編

目次: Linux

半年経ったら完全に忘れるのでメモします。最近JPEGのデコードエンコードが必要になって色々調べていました。Jetson特有のAPI群がありまして、API名はJetson Linux API(のなかのMultimedia APIs)だそうです(Jetson Linux APIドキュメント)。ハードウェアJPEGデコーダ/エンコーダ(NVJPG)を自動的に使用してくれます。

Jetson JPEG encoding

今回はエンコードのAPIをご紹介します。APIの使い方は簡単です。こんな感じでした。

Jetson Linux API JPEG encode API呼び出し順

	NvJPEGEncoder *jpgenc = nullptr;
	NvBuffer *inbuf = nullptr;
	uint8_t *buffer = nullptr;
	size_t bufsize = 0;
	int r;

	// Create
	jpgenc = NvJPEGEncoder::createJPEGEncoder("jpgenc");

	// Align
#define ALIGN_2N(a, b)    (((a) + (b) - 1) & ~((b) - 1))

	NvBuffer::NvBufferPlaneFormat fmts[3];

	fmts[0].width = width;
	fmts[0].height = height;
	fmts[0].bytesperpixel = 1;
	fmts[0].stride = ALIGN_2N(width, 256);
	fmts[0].sizeimage = fmts[0].stride * fmts[0].height;
	fmts[1].width = width / 2;
	fmts[1].height = height / 2;
	fmts[1].bytesperpixel = 1;
	fmts[1].stride = ALIGN_2N(width / 2, 256);
	fmts[1].sizeimage = fmts[1].stride * fmts[1].height;
	fmts[2].width = width / 2;
	fmts[2].height = height / 2;
	fmts[2].bytesperpixel = 1;
	fmts[2].stride = ALIGN_2N(width / 2, 256);
	fmts[2].sizeimage = fmts[2].stride * fmts[2].height;

	inbuf = new NvBuffer(V4L2_BUF_TYPE_VIDEO_CAPTURE_MPLANE, V4L2_MEMORY_USERPTR, 3, fmts, 0);
	if (!inbuf) {
		printf("error in %s:%d\n", __func__, __LINE__);
		return -1;
	}

	r = inbuf->allocateMemory();
	if (r) {
		printf("error in %s:%d\n", __func__, __LINE__);
		return -1;
	}

	bufsize = width * height * 3 / 2;
	buffer = (uint8_t *)malloc(bufsize);

	// Encoding
	uint8_t *jpegbuf = buffer;
	size_t jpegsize = bufsize;
	int quality = 80;
	r = jpgenc->encodeFromBuffer(*inbuf, JCS_YCbCr, &jpegbuf, jpegsize, quality);


	// Destroy
	free(buffer);

	delete inbuf;
	delete jpgenc;

若干NvBufferの確保がややこしいです(参考: NvBufferPlaneのドキュメント、その隣のNvBufferPlaneFormatも参考になります)けど、基本的にはencodeFromBuffer()を呼ぶだけです。

実行

ソースコードを置いておきます。

使い方はコードの先頭にコメントで書いている通りですが、ここでも説明しておきます。引数はありません。ファイル名test_420.yuvのRaw YUV420ファイルを読み込んで、ファイル名jetson_420.jpgのJPEGファイルを書き出します。

コンパイル、結果確認
$ g++ -g -O2 -g -Wall \
    -I jetson_multimedia_api/include/ \
    -I jetson_multimedia_api/include/libjpeg-8b/ \
    jetson_multimedia_api/samples/common/classes/NvJpegDecoder.cpp \
    jetson_multimedia_api/samples/common/classes/NvJpegEncoder.cpp \
    jetson_multimedia_api/samples/common/classes/NvBuffer.cpp \
    jetson_multimedia_api/samples/common/classes/NvElement.cpp \
    jetson_multimedia_api/samples/common/classes/NvElementProfiler.cpp \
    jetson_multimedia_api/samples/common/classes/NvLogging.cpp \
    jetson_enc.cpp \
    -L /usr/lib/aarch64-linux-gnu/nvidia/ \
    -lnvjpeg

$ ./a.out

$ ffplay -i jetson_420.jpg

エンコード結果はJPEGです。ffplayでも普段お使いの画像ビューアでも、何を使って確認しても構いません。

編集者:すずき(2024/12/18 00:00)

コメント一覧

  • コメントはありません。
open/close この記事にコメントする



2024年12月11日

nvJPEGとNVJPGとJetson APIその5 - Jetson Linux API JPEG decode編

目次: Linux

半年経ったら完全に忘れるのでメモします。最近JPEGのデコードエンコードが必要になって色々調べていました。Jetson特有のAPI群がありまして、API名はJetson Linux API(のなかのMultimedia APIs)だそうです(Jetson Linux APIドキュメント)。ハードウェアJPEGデコーダ/エンコーダ(NVJPG)を自動的に使用してくれます。

Jetson JPEG decoding

今回はデコードのAPIをご紹介します。APIの使い方は簡単でこんな感じでした。

Jetson Linux API JPEG decode API呼び出し順

	NvJPEGDecoder *jpgdec = nullptr;
	NvBuffer *outbuf = nullptr;
	int r;

	// Create
	jpgdec = NvJPEGDecoder::createJPEGDecoder("jpgdec");

	// Decoding
	uint32_t jpeg_pixfmt;
	uint32_t jpeg_width;
	uint32_t jpeg_height;
	r = jpgdec->decodeToBuffer(&outbuf, jpegbuf, jpegsize, &jpeg_pixfmt, &jpeg_width, &jpeg_height);

	// Destroy
	delete outbuf;
	delete jpgdec;

注意すべき点は2つあります。1つ目はdecodeToBuffer()が勝手にoutbufを確保して返してくるので、delete outbufしなければならないことです。Turbo JPEGと異なり、予めバッファを確保しておけばメモリ確保処理を回避するような仕組みはなさそうでした。イマイチです。

2つ目はProgressive JPEGがデコードできないことです。デコードしようとするとdecodeToBuffer()でハングします。どんなJPEGファイルが来るかわからない状況で使う場合、JPEGファイルの中身をチェックしてBaseline JPEGはハードウェアデコード、Progressive JPEGはソフトウェアデコードする仕組みが必要です。

しかし前に話したとおりJetson APIの裏にいるlibnvjpeg.soが謎にIJG JPEGのAPIを実装しているため、本家IJG JPEGのlibjpeg.soがリンクできません。この状態でどうやってProgressive JPEGをソフトウェアデコードすれば良いのでしょう。Jetson APIの裏にいるlibnvjpeg.soをIJG JPEGだと思って呼べば動作するんでしょうか?

実行

ソースコードを置いておきます。

使い方はコードの先頭にコメントで書いている通りですが、ここでも説明しておきます。引数はありません。ファイル名test_420.yuvのRaw YUV420ファイルを読み込んで、ファイル名jetson_420.jpgのJPEGファイルを書き出します。

コンパイル、結果確認
$ g++ -g -O2 -g -Wall \
    -I jetson_multimedia_api/include/ \
    -I jetson_multimedia_api/include/libjpeg-8b/ \
    jetson_multimedia_api/samples/common/classes/NvJpegDecoder.cpp \
    jetson_multimedia_api/samples/common/classes/NvJpegEncoder.cpp \
    jetson_multimedia_api/samples/common/classes/NvBuffer.cpp \
    jetson_multimedia_api/samples/common/classes/NvElement.cpp \
    jetson_multimedia_api/samples/common/classes/NvElementProfiler.cpp \
    jetson_multimedia_api/samples/common/classes/NvLogging.cpp \
    jetson_dec.cpp \
    -L /usr/lib/aarch64-linux-gnu/nvidia/ \
    -lnvjpeg

$ ./a.out

$ ffplay -f rawvideo -video_size 1920x1440 -pixel_format yuv420p -i jetson_420.yuv

デコード結果のRawvideoを確認するときはffplayを使うと便利です。

編集者:すずき(2024/12/18 00:00)

コメント一覧

  • コメントはありません。
open/close この記事にコメントする



link もっと前
2024年12月24日 >>> 2024年12月11日
link もっと後

管理用メニュー

link 記事を新規作成

<2024>
<<<12>>>
1234567
891011121314
15161718192021
22232425262728
293031----

最近のコメント5件

  • link 21年9月20日
    すずきさん (11/19 01:04)
    「It was my pleasure.」
  • link 21年9月20日
    whtさん (11/17 23:41)
    「This blog solves my ...」
  • link 24年10月1日
    すずきさん (10/06 03:41)
    「xrdpで十分動作しているので、Wayl...」
  • link 24年10月1日
    hdkさん (10/03 19:05)
    「GNOMEをお使いでしたら今はWayla...」
  • link 24年10月1日
    すずきさん (10/03 10:12)
    「私は逆にVNCサーバーに繋ぐ使い方をした...」

最近の記事3件

  • link 23年12月23日
    すずき (12/25 18:57)
    「[サンタ - まとめリンク] 目次: サンタ一覧が欲しくなったので作りました。サンタがマッハ2で街にやってくる(2021年)サ...」
  • link 24年12月24日
    すずき (12/25 18:55)
    「[サンタ宇宙へ(2024年)] 目次: サンタ去年(2023年12月24日の日記参照)と同様に、飛行機の位置をリアルタイムに表...」
  • link 24年12月9日
    すずき (12/19 11:01)
    「[nvJPEGとNVJPGとJetson APIその4 - Jetson Linux API] 目次: Linux半年経ったら...」
link もっとみる

こんてんつ

open/close wiki
open/close Linux JM
open/close Java API

過去の日記

open/close 2002年
open/close 2003年
open/close 2004年
open/close 2005年
open/close 2006年
open/close 2007年
open/close 2008年
open/close 2009年
open/close 2010年
open/close 2011年
open/close 2012年
open/close 2013年
open/close 2014年
open/close 2015年
open/close 2016年
open/close 2017年
open/close 2018年
open/close 2019年
open/close 2020年
open/close 2021年
open/close 2022年
open/close 2023年
open/close 2024年
open/close 過去日記について

その他の情報

open/close アクセス統計
open/close サーバ一覧
open/close サイトの情報

合計:  counter total
本日:  counter today

link About www.katsuster.net
RDFファイル RSS 1.0

最終更新: 12/25 18:57