1/* 2 * Copyright 2017, Adrien Destugues, pulkomandy@pulkomandy.tk 3 * Distributed under terms of the MIT license. 4 */ 5 6 7#include <Application.h> 8#include <Bitmap.h> 9#include <File.h> 10#include <MediaFile.h> 11#include <MediaTrack.h> 12#include <Window.h> 13 14#include <stdio.h> 15 16 17#pragma mark - VideoView 18 19 20class VideoView: public BView 21{ 22 public: 23 VideoView(BMediaTrack* track, int32 width, int32 height); 24 void Draw(BRect); 25 void KeyDown(const char*, int32); 26 27 private: 28 BMediaTrack* fMediaTrack; 29 BBitmap fBitmap; 30}; 31 32 33VideoView::VideoView(BMediaTrack* track, int32 width, int32 height) 34 : BView(BRect(0, 0, width, height), "Video", B_FOLLOW_NONE, 35 B_WILL_DRAW) 36 , fMediaTrack(track) 37 , fBitmap(BRect(0, 0, width - 1, height - 1), B_RGB32) 38{ 39} 40 41 42void 43VideoView::Draw(BRect r) 44{ 45 DrawBitmap(&fBitmap); 46} 47 48 49void 50VideoView::KeyDown(const char*, int32) 51{ 52 puts("Next frame"); 53 int64 count = 1; 54 fMediaTrack->ReadFrames(fBitmap.Bits(), &count); 55 Invalidate(); 56} 57 58 59#pragma mark - VideoWindow 60 61 62class VideoWindow: public BWindow 63{ 64public: 65 VideoWindow(const char* videoFile); 66 ~VideoWindow(); 67 68private: 69 BFile* fFile; 70 BMediaFile* fMediaFile; 71 BMediaTrack* fMediaTrack; 72}; 73 74 75VideoWindow::VideoWindow(const char* path) 76 : BWindow(BRect(60, 120, 700, 600), "Video Decoder", 77 B_DOCUMENT_WINDOW, B_QUIT_ON_WINDOW_CLOSE) 78 , fMediaTrack(NULL) 79{ 80 fFile = new BFile(path, B_READ_ONLY); 81 fMediaFile = new BMediaFile(fFile); 82 media_format format; 83 84 int i; 85 for (i = fMediaFile->CountTracks(); --i >= 0;) { 86 BMediaTrack* mediaTrack = fMediaFile->TrackAt(i); 87 88 mediaTrack->EncodedFormat(&format); 89 if (format.IsVideo()) { 90 fMediaTrack = mediaTrack; 91 fMediaTrack->DecodedFormat(&format); 92 break; 93 } 94 } 95 96 if (fMediaTrack) { 97 printf("Found video track\n%ld x %ld ; %lld frames, %f seconds\n", 98 format.Width(), format.Height(), fMediaTrack->CountFrames(), 99 fMediaTrack->Duration() / 1000000.f); 100 } else { 101 return; 102 } 103 104 BView* view = new VideoView(fMediaTrack, format.Width(), format.Height()); 105 AddChild(view); 106 view->MakeFocus(); 107} 108 109 110VideoWindow::~VideoWindow() 111{ 112 delete fMediaFile; // Also deletes the track 113 delete fFile; 114} 115 116 117#pragma mark - Main 118 119 120int main(int argc, char* argv[]) 121{ 122 if (argc < 2) 123 return -1; 124 125 BApplication app("application/x-vnd.Haiku-VideoDecoder"); 126 127 BWindow* window = new VideoWindow(argv[1]); 128 window->Show(); 129 130 app.Run(); 131} 132