SDカードから失われた動画を復旧する

ffmpeg で -i オプションにワイルドカードを使ったらSDカード内のAVIがごっそり0バイトになって焦った。

ここは本気を出さねばならない。

selfImageで、メディアまるごとのバイナリイメージを取って、以下のコードを実行し、「"RIFF"から始まるファイル」に分割。なんせ元のファイルサイズが失われてるのでほんとはきちんとRIFFフォーマットを解析しなきゃならないのだが、面倒なので。
あとは、出来上がった「後ろにおまけのついた動画ファイル」を無理やり動画コンバータに放り込んで変換成功。

ふぅ、冷汗かいた。

int _tmain(int argc, _TCHAR* argv[])
{
	char buf[BUF_SIZE];

	FILE* fp;
	::fopen_s(&fp, "sd_card.img", "rb");
	FILE* fOut=NULL;
	int count=0;
	while(!::feof(fp)){
		::fread(buf, 1, BUF_SIZE, fp);
		if(fOut)::fwrite(buf, 1, BUF_SIZE,fOut);

		long cur=0;
		while(cur<BUF_SIZE){
			const char* pos=(const char*)::memchr(buf+cur, 'R', BUF_SIZE-cur);
			if(!pos){
				break;
			}
			if(::memcmp(pos, "RIFF", 4)==0){
				if(fOut)::fclose(fOut);
				char fname[20];
				::sprintf(fname, "%d.avi", count);
				fOut=::fopen(fname, "wb");
				::fwrite(pos, 1, BUF_SIZE-(pos-buf), fOut);
				count++;
			}
			cur=pos-buf+1;
		}
	}
	if(fOut)::fclose(fOut);
	::fclose(fp);
	
	return 0;
}