Приветсвую всех!
Вот, меня вопрос заинтересовал - возможно ли выжигать рисунки на CD, чтоб их было
видно визуально на поверхности диска. Т.е. должны ли отличаться нули и единицы
записанные на CD визуально?
Сам я попытался для определения этого написать нехитрую программку, которая
вроде как определяет "полосатый" образ:
#include <stdio.h>
#include <stdlib.h>
#define MB *1024*1024
main()
{
for (long long i=0; i<100 MB; i++)
printf ("%c",'\0');
for (long long i=0; i<100 MB; i++)
printf ("%c",255);
for (long long i=0; i<100 MB; i++)
printf ("%c",'\0');
for (long long i=0; i<100 MB; i++)
printf ("%c",255);
for (long long i=0; i<100 MB; i++)
printf ("%c",'\0');
for (long long i=0; i<100 MB; i++)
printf ("%c",255);
for (long long i=0; i<100 MB; i++)
printf ("%c",'\0');
}
К сожалению запись файла созданного такой программой на CD-RW (уже до этого
многократно раз перезаписанного) ничего увидеть не позволила :-(
CD-R портить не охота, совсем чистого CD-RW у меня к сожалению нет - поэтому
ещё проверить как-то нет у меня возможности..
В общем хотелось бы узнать возможно ли всё же это..
> У CD-RW другой принцип - на нём не выйдет.
> По идее, да. Видно же записанную часть на CD-R визуально. Вопрос только в том,
> насколько будут отличаться области "0" от "1".
По этой идее и на CD-RW должно получаться - на нём записанную часть тоже визуально видно!
А всё же в самом деле правильно там написано!
Различается, но только при режиме записи audio и только те последовательности в
которых биты 0 и 1 чередуются с разной частотой (т.е. 00 и FF в самом деле не
различимы). И видно даже на CD-RW! (Но CD-R-ку одну я тоже успел запортить)..
Итого программка теперь такая:
>т.е. 00 и FF в самом деле не различимы
Я почему-то не фтыкнул, почему. 00 - восемь дырок подряд, FF - восемь непрожженных мест.
Почему так?
Да, и насколько я понял, ничего осмысленного кроме колец ты выжечь не сможешь, ведь
физическое местоположение данного байта на болванке выяснить нельзя.
>кстати в моём man cdrecord ничего про это нет
tattooinfo
Use this option together with -checkdrive to retrieve the image size information for the
Yamaha DiskT@2 feature. The images always have a line length of 3744 pixel. Line number 0
(radius 0) is mapped to the center of the disk. If you know the inner and outer radius you
will be able to create a pre distorted image that later may appear undistorted on the disk.
tattoofile=name
Use this option together with -checkdrive to write an image prepared for the Yamaha DiskT@2
feature to the medium. The file must be a file with raw image B&W data (one byte per pixel)
in a size as retrieved by a previous call to tattoofile=name . If the size of the image
equals the maximum possible size (3744 x 320 pixel), cdrecord will use the first part of the
file. This first part then will be written to the leftover space on the CD.
Note that the image must be mirrored to be readable from the pick up side of the CD.
> Я почему-то не фтыкнул, почему. 00 - восемь дырок подряд, FF - восемь
> непрожженных мест.
> Почему так?
Оптика очевидно... Надо рассматривать этот вопрос со стороны оптики..
> Да, и насколько я понял, ничего осмысленного кроме колец ты выжечь не сможешь ведь
> физическое местоположение данного байта на болванке выяснить нельзя.
Ну почему же? Вот тело той же программы, но как видите теперь записываются
круги так сказать шириной по 2 "Мб"..
char buffer[2352];
for (int o=0; o<152; o++)
{
memset(buffer, '\xAA', 2352);
for (long long i=0; i<2 MB; i++)
fwrite (buffer, 2352, 1, stdout);
memset(buffer, 0, 2352);
for (long long i=0; i<2 MB; i++)
fwrite (buffer, 2352, 1, stdout);
}
Так, вот на радиусе ~54.5 мм отчётливо видно, что "зебра" кончается, а это значит,
что именно там "дорожка" имеет как раз длину 2 "Мб".
Исходя из этих данных пишется примерно такая программа:
#include <stdio.h>
#include <stdlib.h>
#include <string.h>
#include <math.h>
#define MB *512
main ()
{
int all=2352*600 MB;
int c=0;
int tr0=2352*460;
float r0=24.5;
float dr=0.075;
int tr=tr0;
float r=r0;
while (c<(all-2352*512*3))
{
fprintf(stderr, "r=%g, tr=%g, count=%g\n",r,(float)tr/2352/512,(float)c/
for (long long i=0; i<tr/2; i++)
printf ("%c", '\xAA');
for (long long i=0; i<tr/2; i++)
printf ("%c", 0);
//fwrite (buffer, 2352, 1, stdout);
if (tr%2==1) printf ("%c", 0);
c+=tr;
tr=(float)tr*(r+dr)/r;
r+=dr;
}
while (c<all)
{
printf ("%c", 0);
c++;
}
}
В идеале эта программка должна выжечь линию разделяющую болванку пополам..
Но к сожалению мои измерения и расчёты явно слишком грубы и..
Видно, что поверхность болванки не однородна - есть некоторый узор!
Так, что надо только подобрать или более точно измерить/вычислить параметры tr0,
r0 и dr.. и тогда мы ещё пингвина на болванке выжгем :-)
Буду рад если, кто-нибудь тоже попробует.. Может есть какие-нить дома точные
измерительные приборы..
> >кстати в моём man cdrecord ничего про это нет
> tattooinfo
Да, правда нету (ASPLinux 10, Cdrecord-Clone 2.01-dvd)
>Скорее всего нет :) Видимо, кодируются переходы 0-1, 1-0. У меня под рукой нет описалова, так что не скажу точно.
Там каждый байт кодируется кодом с добавлением избыточной информации. Вроде из одного байта получается 14 бит, причём таким образом, что более 3-4 одинаковых битов подряд отсутсвует, отсюда и неразличимость 0х00 от 0xFF.
Так, забудьте про мой предыдущий пост - ошибка там слишком сильна...
Благодаря статьям:
http://en.wikipedia.org/wiki/CDhttp://www.cdrinfo.com/Sections/Articles/Specific.asp?ArticleHeadline=Writing+Qu
ality&index=1http://en.wikipedia.org/wiki/Eight-to-Fourteen_Modulationhttp://www.physics.udel.edu/wwwusers/watson/scen103/efm.html
Удалось выяснить значит, что
расстояние между дорожками - 1.6 микрометров
длина pit'ов - от 0.83 мкм (2 нуля) до 3.56 мкм (16 нулей)
значит один 0 имеет длину на дорожке около 0.42 мкм.
Учитывая также что первая дорожка имеет радиус около 24.5 мм и один байт
кодируется 14-ю битами, получаем, что первая дорожка вмещает:
24.5мм * 2pi / 0.42 мкм / 14 ~ 26000 байт ~ 11 секторов аудио данных (1 сектор=2352 байт)
Для проверки и может быть уточнения данных был создан образ с перемежающимися
областями \x00 и \xAA по 8 секторов:
#include <stdio.h>
#include <stdlib.h>
#include <string.h>
#include <math.h>
#define MB *512
main()
{
char buffer[2352];
for (int o=0; o<38 MB; o++)
{
memset(buffer, '\xAA', 2352);
for (long long i=0; i<8; i++)
fwrite (buffer, 2352, 1, stdout);
memset(buffer, 0, 2352);
for (long long i=0; i<8; i++)
fwrite (buffer, 2352, 1, stdout);
}
}
И на диске где-то на 40.5 мм от центра чётка видна некоторая область явно
отличающаяся от того что идёт до и после неё. Именно в этой области происходит
поворот спирали (именно там объём данных вмещаемых дорожкой равен 16
секторам).
Более того, по характеру этого перехода я смог определить что лазер движется по
диску по часовой стрелке (позвонил брату - он подтвердил, что в CD-плеере диск
вращается по часовой стрелке).
В общем осталось дело совсем за малым :-)
Спасибо большое, респекты прибавляют вдохновения :-)
Следующая программка, делает образ, который рисует уже хорошо (особенно в
начале диска) различимую спираль:
#include <stdio.h>
#include <stdlib.h>
#include <string.h>
#include <math.h>
#define MB *512
main ()
{
int all=2352* 612;
int c=0;
int tr0=23000;
double r0=24.75;
double dr=0.0016;
int tr=tr0;
double r=r0;
while (c<(all-tr))
{
fprintf(stderr, "r=%g, tr=%g, count=%g\n",r,(double)tr/2352/512,(double)c/1024/1024);
int asize=tr/4;
for (long long i=0; i<asize; i++)
printf ("%c", '\xAA');
for (long long i=0; i<(tr-asize); i++)
printf ("%c", 0);
c+=tr;
r+=dr;
tr=(double)tr0*r/r0;
}
while (c<all)
{
printf ("%c", 0);
c++;
}
}
Следующий код "нарезает" спираль ориентированную против часовой стрелки и
хорошо различимую уже на всей поверхности диска:
#include <stdio.h>
#include <stdlib.h>
#include <string.h>
#include <math.h>
char buffer[2352];
int c=0;
void bw (char b)
{
buffer[c++]=b;
if (c>=2352)
{
fwrite (buffer, 2352, 1, stdout);
c=0;
}
}
#define MB *512
main ()
{
int all=2352* 612 MB;
int c=0;
int tr0=23070;
double r0=25.00;
double dr=0.00152;
int tr=tr0;
double r=r0;
while (c<(all-tr))
{
fprintf(stderr, "r=%g, tr=%g, count=%g\n",r,(double)tr/2352,(double)c/1024/1024);
int asize=tr/4;
for (long long i=0; i<asize; i++)
bw ('\xAA');
for (long long i=0; i<(tr-asize); i++)
bw (0);
c+=tr;
r+=dr;
tr=(double)tr0*r/r0;
}
fwrite (buffer, 2352, 1, stdout);
}
Сейчас я могу совершенно определенно сказать, что параметр dr должен лежать в
пределах 0.00152-0.00153 :-)
Что ж.. будем выпрямлять далее..
> А можно скрин, а то у меня сейчас чистых болванот под рукой нету, а посмотреть
> как спираль выглядит охота, т.е. не скрин а фотку.
Не, к сожалению у меня нет возможности сфотографировать..
> да вот толку - что от прозрачных менюшек... :)
Ну, вот видите - сами всё понимаете ;-)
Да, к сожалению с нижней гранью dr я ошибся из-за чего записал кучу лишних образов и потратил более 2 часов времени напрасно :-(
Ну, ничего сейчас граница dr у меня предполагается в районе 0.001519-0.00151920, и вторая граница уже очень близка..
Буду мучать дальше.. лишь бы привод не сдох..
Жалко, конечно, что никак нельзя избежать этого шифрования 8-к-14.. Из-за этого мы максимум можем поддерживать всего 5 градаций яркости..