Posts Tagged ‘psp’
Saturday, March 10th, 2007
I created this little perl program that creates an RSS feed from a set of video files (.mp4). This is useful to wirelessly transfer files to the PSP. The files will be saved in the VIDEO folder of the PSP.
You’ll need to install MP4::Info and HTTP::Daemon from CPAN first.
#!/usr/bin/perl -w
# this small program starts a http daeomon listening on port 1111 and provides a RSS feed
# to all .mp4 files stored in the 'videos' folder.
# This program is intended to transfer movie files via wireless. Using the sony psp RSS feed utility
# 1. Start the server with ./rssstandaloneserver.pl
# 2. Copy some video files on videos subfolder
# 3. Point you PSP browser to the http://<address>:<port>/ and the psp browser will display a page to
# subscribe to the feed.
# 4. Go to Psp->Network->RSS Channel and select the new feed
# 5. A list of items should appear and pressing X will download the video files to your VIDEO folder
# on the PSP memory stick
# Please note that depending of your firmware and the encoder you used on your files PSP may refuse
# to play those files from the VIDEO folder. The VIDEO folder is not just like the MP_ROOT/100ANV01
# folder, it behaves a different way. So please first check and transfer some of your files via USB to the
# VIDEO folder and check that the PSP is able to play them from there.
# If you encode your files using the Media Manager for PSP software then those files will work in any folder.
# If you use 3GP encoder and QVGA MPEG-4 then those also will work in the VIDEO folder. but if you use
# another resolution or AVC codec then it won't work.
use HTTP::Daemon;
use HTTP::Status;
use XML::RSS;
use MP4::Info;
use File::stat;
use Time::localtime;
use URI::Escape;
use Encode;
use LWP::MediaTypes;
#configuration
my $feedtitle = "Perl Video Feed";
my $feeddesc = "ecerulm perl video feed";
my $hostname = "192.168.1.3";
my $port = 1111;
my $debug = 1;
#end of configuration
my $rootaddr="http://" . $hostname . ":" . $port;
my $ct = "video/m4v";
LWP::MediaTypes::add_type($ct => qw(mp4 MP4));
my $d = HTTP::Daemon->new(LocalPort => $port) || die;
print "Please contact me at: <URL:", $d->url, ">\n";
while (my $c = $d->accept) {
while (my $r = $c->get_request) {
my $url = URI::Escape::uri_unescape($r->url->path);
print $r->method . " " . "$url\n" if $debug;
if ($r->method eq 'GET' and $url eq "/") {
print "sending index.htm\n";
$c->send_file_response("index.htm");
} elsif ($url eq "/index.rss") {
print "generating RSS content\n";
my $rss = new XML::RSS (version => '2.0');
$rss->channel(title => $feedtitle,
link => $rootaddr,
description => $feeddesc,
);
$rss->image(title => 'Perl video feed',
url => $rootaddr . "/images/feedimage.jpg",
link => $rootaddr,
width => 88,
height => 115,
description => 'feed logo'
);
# videos
my @fileList = <videos/*.MP4>;
foreach $file (@fileList) {
my $tag = get_mp4tag($file) or die "No TAG info";
$date_string = ctime(stat($file)->mtime);
#my $enclosurelink = "http://192.168.1.3:1111/" . URI::Escape::uri_escape_utf8($file);
my $enclosurelink = $rootaddr . "/" . URI::Escape::uri_escape_utf8($tag->{NAM}) . ".MP4";
#my $enclosurelink =~ s/videos%2F/videos\//;
$rss->add_item(title => $tag->{NAM},
enclosure => {
url=>$enclosurelink,
type=>$ct,
},
description => $tag->{NAM},
pubDate=>$date_string
);
}
# or save it to a file
my $rs = new HTTP::Response(RC_OK);
$rs->header('Content-type', "application/rss+xml");
$rs->content($rss->as_string) if $r->method eq 'GET';
$c->send_response($rs);
print "RSS content sent\n" if $debug;
} elsif (-e "." . $url) {
print "the $url maps directly to a file in the filesystem\n" if $debug;
if ($r->method eq 'GET') {
print "sending " . $r->method . " " . $url . "\n";
$c->send_file_response("." . $url) if $r->method eq 'GET';
} else {
print "sending HEAD " . $url . "\n";
$c->send_basic_header;
print $c "Content-type: $ct\n\n";
}
} else {
print "$url doesn't map to file directly. We assume the url is the movie title\n" if $debug;
my $t = $url;
$t = Encode::decode("UTF-8", $t);
$t = substr($t,1,-4); #remove the ".mp4" part.
print "looking for a file with movie title: $t\n" if $debug;
my @files = <videos/*.MP4>;
my $found = 0;
foreach $f (@files) {
my $tag = get_mp4tag($f) or next;
if ($tag->{NAM} eq $t) {
print "sending " . $f . " file\n";
$c->send_file_response($f);
$found = 1;
last;
}
}
unless ($found) {
print "cannot find " . $url . " using method " . $r->method . "\n";
$c->send_error(RC_NOT_FOUND);
}
}
}
$c->close;
undef($c);
}
Tags: files, http, psp, rss, server, tranfer, wifi, wireless
Posted in Uncategorized | No Comments »
Wednesday, February 28th, 2007
Jonathan Harris has just released a new version of MP4::Info adding support for Sony PSP title and encoder.
Movie title and the encoder used are now accessible under $tag->{NAM} and $tag->{TOO}
use MP4::Info;
my $file = 'MAQ12331.MP4';
my $tag = get_mp4tag($file) or die "No TAG info";
printf "$file title:%s encoder: %s\n", $tag->{NAM}, $tag->{TOO};
see my related post
Tags: encoder, info, mp4, perl, psp, sony, tag, title
Posted in Uncategorized | 1 Comment »
Tuesday, February 27th, 2007
Today I opened a new feature request (http://rt.cpan.org/Ticket/Display.html?id=25178) on MP4::Info perl module to include my patch to read the title in a Sony PSP files. Read this post to know more about the way title is encoded in PSP Mp4 files. With the following patch mp4infopatch.txt (applied to Info.pm) you can read the title of an PSP MP4 file using the following code snippet:
use MP4::Info;
my $file = 'MAQ12033.MP4';
my $tag = get_mp4tag($file) or die "No TAG info";
printf "$file title is %s\n", $tag->{NAM};
my $info = get_mp4info($file);
printf "$file title is %s\n", $info->{NAM};
my $mp4 = new MP4::Info $file;
printf "$file title is %s\n", $mp4->title;
UPDATE: Jonathan Harris has released a new version of MP4::Info with support for Sony’s PSP files. more info
Tags: mp4, mtdt, psp, sony, tag, title, usmt, uuid
Posted in Uncategorized | 2 Comments »
Sunday, February 25th, 2007
Here I included an example of a custom uuid USMT->MTDT block in a Sony PSP MP4 file
06A55450 75 75 69 64 55 53 4D 54 21 D2 4F CE BB 88 69 5C uuidUSMT!.O...i\
06A55460 FA C9 C7 40 00 00 00 90 4D 54 44 54 00 04 00 0C ...@....MTDT....
06A55470 00 00 00 0B 55 C4 00 00 02 1C 00 22 00 00 00 04 ....U......"....
06A55480 15 C7 00 01 00 50 00 53 00 50 00 20 00 56 00 69 .....P.S.P. .V.i
06A55490 00 64 00 65 00 6F 00 20 00 39 00 00 00 26 00 00 .d.e.o. .9...&..
06A554A0 00 01 2A 0E 00 01 00 54 00 68 00 65 00 20 00 67 ..*....T.h.e. .g
06A554B0 00 6F 00 64 00 66 00 61 00 74 00 68 00 65 00 72 .o.d.f.a.t.h.e.r
06A554C0 00 00 00 32 00 00 00 03 55 C4 00 01 00 32 00 30 ...2....U....2.0
06A554D0 00 30 00 37 00 2F 00 30 00 32 00 2F 00 32 00 33 .0.7./.0.2./.2.3
06A554E0 00 20 00 32 00 30 00 3A 00 33 00 31 00 3A 00 33 . .2.0.:.3.1.:.3
06A554F0 00 34 00 00 .4..
The title “The godfather” is encoded in UTF-16 at position 06A554A7. To know a little bit more about the Sony PSP way of storing titles read this.
Tags: example, mp4, mtdt, psp, sony, title, usmt
Posted in psp | No Comments »
Sunday, February 25th, 2007
If you had tried to read the title of a Sony PSP MP4 file with Ruby’s mp4info or Perl’s MP4::Info you probably noticed that the title is not stored in the NAM tag where it should be. Those two libraries cannot access the title info in Sony PSP files because title info is stored in a propierary way in a custom uuid atom called USMT. Inside this atom there is the MTDT meta info block and inside this block you can find the title. I found all this information in the movenc.c file from ffmpeg
+/*********
+
+ PSP USMT->MTDT meta info block format (some guessing)
+
+ - Note that clips play fine without this block.
+
+ int32 : size of MTDT block
+ char[4] : "MTDT"
+ int16 : Number of sub-data blocks (payloads)
+ 0x0001 EOT markers have 1 block
+ 0x0004 is the most I've seen in an information block (title, date, etc)
+
+ Some number of data blocks, which take the form of:
+
+ int16 : size of sub-data block
+ int32 : block type ID (possibly 2 int16s: unk & type )
+ 0x01 = Title
+ 0x03 = Timestamp (date format = "+%Y-%m-%d %k:%M:%S")
+ 0x04 = Creator Name
+ 0x0A = End of Track Marker
+ 0x0B = UNKNOWN (appears in info MTDT blocks)
+ int16 : ?flags? - generally 0x55c4 or 0x15c7, seen 0x2a0e, possibly font or language?)
+ - Timestamp seems to always have 0x55c4
+ int16 : type of payload that follows? (int, string, etc..?)
+ - Unicode strings have 0x0001
+ - short[] data has 0x0000
+ data[] : Payload (strings are UTF16-BE short[] with 0x0000 terminator)
+
+
+ BLOCK IDs
+
+ 0x000A - Appear at end of tracks
+
+ - flags always = 0x55c4
+ - Payload looks like: 0x0000 0x0100 0x0000 0x0000
+
+ 0x000B - Appears in meta data
+ - Payload looks like: 0x0000 0x?????
+ - (0x???? probably flags- seen 0x1c02, 0x5cfe. Maybe something with aspect ratio or frame rate?)
+
+********/
Currently neither mp4info nor MP4::Info are capable of decoding this USMT->MTDT block. I’m looking into MP4::Info in order to add support for it. I will post something here if I got it working.UPDATE: I got it working read post
Tags: metadata, mp4, mpeg-4, mtdt, NAM, psp, sony, tag, title, usmt
Posted in psp | 1 Comment »
Sunday, February 25th, 2007
If you’re new to the PSP you must remember when copying files video files (created with 3GP converter or PSP Video 9) to your PSP that M4Vxxxxx.MP4 files go to the MP_ROOT/100MNV01 dir of the Memory Stick and the MAQxxxxx.MP4 files go to MP_ROOT/101ANV01 dir.
M4Vxxxxx files are conventional MPEG-4 files and MAQxxxxx are MPEG-4 files usign AVC codec (recommended).
Tags: avc, filename, memory, mp4, mpeg-4, ms, playstation, portable, psp, sony, stick
Posted in psp | No Comments »