dvr_surface.cpp revision eaa5522feac452703a0836310047d4b15702487d
1bdcee79b0d7e87cb48049907a7ba8201d0288f75Jiwen 'Steve' Cai#include "include/dvr/dvr_surface.h" 2bdcee79b0d7e87cb48049907a7ba8201d0288f75Jiwen 'Steve' Cai 3bdcee79b0d7e87cb48049907a7ba8201d0288f75Jiwen 'Steve' Cai#include <private/dvr/display_client.h> 4bdcee79b0d7e87cb48049907a7ba8201d0288f75Jiwen 'Steve' Cai 5bdcee79b0d7e87cb48049907a7ba8201d0288f75Jiwen 'Steve' Caiusing namespace android; 6bdcee79b0d7e87cb48049907a7ba8201d0288f75Jiwen 'Steve' Cai 774cf084cab653537e89f46b90344b3133a94b3a3Jiwen 'Steve' Caistruct DvrSurface { 874cf084cab653537e89f46b90344b3133a94b3a3Jiwen 'Steve' Cai std::unique_ptr<dvr::DisplaySurfaceClient> display_surface_; 974cf084cab653537e89f46b90344b3133a94b3a3Jiwen 'Steve' Cai}; 1074cf084cab653537e89f46b90344b3133a94b3a3Jiwen 'Steve' Cai 11bdcee79b0d7e87cb48049907a7ba8201d0288f75Jiwen 'Steve' Caiextern "C" { 12bdcee79b0d7e87cb48049907a7ba8201d0288f75Jiwen 'Steve' Cai 1374cf084cab653537e89f46b90344b3133a94b3a3Jiwen 'Steve' Caiint dvrSurfaceCreate(int width, int height, int format, uint64_t usage0, 1474cf084cab653537e89f46b90344b3133a94b3a3Jiwen 'Steve' Cai uint64_t usage1, int flags, DvrSurface** out_surface) { 1574cf084cab653537e89f46b90344b3133a94b3a3Jiwen 'Steve' Cai if (out_surface == nullptr) { 1674cf084cab653537e89f46b90344b3133a94b3a3Jiwen 'Steve' Cai ALOGE("dvrSurfaceCreate: invalid inputs: out_surface=%p.", out_surface); 1774cf084cab653537e89f46b90344b3133a94b3a3Jiwen 'Steve' Cai return -EINVAL; 1874cf084cab653537e89f46b90344b3133a94b3a3Jiwen 'Steve' Cai } 1974cf084cab653537e89f46b90344b3133a94b3a3Jiwen 'Steve' Cai 2074cf084cab653537e89f46b90344b3133a94b3a3Jiwen 'Steve' Cai int error; 2174cf084cab653537e89f46b90344b3133a94b3a3Jiwen 'Steve' Cai auto client = dvr::DisplayClient::Create(&error); 2274cf084cab653537e89f46b90344b3133a94b3a3Jiwen 'Steve' Cai if (!client) { 2374cf084cab653537e89f46b90344b3133a94b3a3Jiwen 'Steve' Cai ALOGE("Failed to create display client!"); 2474cf084cab653537e89f46b90344b3133a94b3a3Jiwen 'Steve' Cai return error; 2574cf084cab653537e89f46b90344b3133a94b3a3Jiwen 'Steve' Cai } 2674cf084cab653537e89f46b90344b3133a94b3a3Jiwen 'Steve' Cai 2774cf084cab653537e89f46b90344b3133a94b3a3Jiwen 'Steve' Cai // TODO(hendrikw): When we move to gralloc1, pass both usage0 and usage1 down. 2874cf084cab653537e89f46b90344b3133a94b3a3Jiwen 'Steve' Cai std::unique_ptr<dvr::DisplaySurfaceClient> surface = 2974cf084cab653537e89f46b90344b3133a94b3a3Jiwen 'Steve' Cai client->CreateDisplaySurface( 3074cf084cab653537e89f46b90344b3133a94b3a3Jiwen 'Steve' Cai width, height, static_cast<int>(usage0 | usage1), format, flags); 3174cf084cab653537e89f46b90344b3133a94b3a3Jiwen 'Steve' Cai 3274cf084cab653537e89f46b90344b3133a94b3a3Jiwen 'Steve' Cai DvrSurface* dvr_surface = new DvrSurface; 3374cf084cab653537e89f46b90344b3133a94b3a3Jiwen 'Steve' Cai dvr_surface->display_surface_ = std::move(surface); 3474cf084cab653537e89f46b90344b3133a94b3a3Jiwen 'Steve' Cai *out_surface = dvr_surface; 3574cf084cab653537e89f46b90344b3133a94b3a3Jiwen 'Steve' Cai return 0; 3674cf084cab653537e89f46b90344b3133a94b3a3Jiwen 'Steve' Cai} 3774cf084cab653537e89f46b90344b3133a94b3a3Jiwen 'Steve' Cai 3874cf084cab653537e89f46b90344b3133a94b3a3Jiwen 'Steve' Caiint dvrSurfaceGetWriteBufferQueue(DvrSurface* surface, 3974cf084cab653537e89f46b90344b3133a94b3a3Jiwen 'Steve' Cai DvrWriteBufferQueue** out_writer) { 4074cf084cab653537e89f46b90344b3133a94b3a3Jiwen 'Steve' Cai if (surface == nullptr || out_writer == nullptr) { 4174cf084cab653537e89f46b90344b3133a94b3a3Jiwen 'Steve' Cai ALOGE( 4274cf084cab653537e89f46b90344b3133a94b3a3Jiwen 'Steve' Cai "dvrSurfaceGetWriteBufferQueue: Invalid inputs: surface=%p, " 4374cf084cab653537e89f46b90344b3133a94b3a3Jiwen 'Steve' Cai "out_writer=%p.", 4474cf084cab653537e89f46b90344b3133a94b3a3Jiwen 'Steve' Cai surface, out_writer); 4574cf084cab653537e89f46b90344b3133a94b3a3Jiwen 'Steve' Cai return -EINVAL; 4674cf084cab653537e89f46b90344b3133a94b3a3Jiwen 'Steve' Cai } 4774cf084cab653537e89f46b90344b3133a94b3a3Jiwen 'Steve' Cai DvrWriteBufferQueue* buffer_writer = new DvrWriteBufferQueue; 4874cf084cab653537e89f46b90344b3133a94b3a3Jiwen 'Steve' Cai buffer_writer->producer_queue_ = 4974cf084cab653537e89f46b90344b3133a94b3a3Jiwen 'Steve' Cai surface->display_surface_->GetProducerQueue(); 5074cf084cab653537e89f46b90344b3133a94b3a3Jiwen 'Steve' Cai if (buffer_writer->producer_queue_ == nullptr) { 5174cf084cab653537e89f46b90344b3133a94b3a3Jiwen 'Steve' Cai ALOGE( 5274cf084cab653537e89f46b90344b3133a94b3a3Jiwen 'Steve' Cai "dvrSurfaceGetWriteBufferQueue: Failed to get producer queue from " 5374cf084cab653537e89f46b90344b3133a94b3a3Jiwen 'Steve' Cai "display surface."); 5474cf084cab653537e89f46b90344b3133a94b3a3Jiwen 'Steve' Cai return -ENOMEM; 5574cf084cab653537e89f46b90344b3133a94b3a3Jiwen 'Steve' Cai } 5674cf084cab653537e89f46b90344b3133a94b3a3Jiwen 'Steve' Cai 5774cf084cab653537e89f46b90344b3133a94b3a3Jiwen 'Steve' Cai *out_writer = buffer_writer; 5874cf084cab653537e89f46b90344b3133a94b3a3Jiwen 'Steve' Cai return 0; 5974cf084cab653537e89f46b90344b3133a94b3a3Jiwen 'Steve' Cai} 6074cf084cab653537e89f46b90344b3133a94b3a3Jiwen 'Steve' Cai 61eaa5522feac452703a0836310047d4b15702487dHendrik Wagenaarint dvrGetNamedBuffer(const char* name, DvrBuffer** out_buffer) { 62bdcee79b0d7e87cb48049907a7ba8201d0288f75Jiwen 'Steve' Cai auto client = android::dvr::DisplayClient::Create(); 63bdcee79b0d7e87cb48049907a7ba8201d0288f75Jiwen 'Steve' Cai if (!client) { 64eaa5522feac452703a0836310047d4b15702487dHendrik Wagenaar ALOGE("dvrGetNamedBuffer: Failed to create display client!"); 65bdcee79b0d7e87cb48049907a7ba8201d0288f75Jiwen 'Steve' Cai return -ECOMM; 66bdcee79b0d7e87cb48049907a7ba8201d0288f75Jiwen 'Steve' Cai } 67bdcee79b0d7e87cb48049907a7ba8201d0288f75Jiwen 'Steve' Cai 68eaa5522feac452703a0836310047d4b15702487dHendrik Wagenaar if (out_buffer == nullptr || name == nullptr) { 69eaa5522feac452703a0836310047d4b15702487dHendrik Wagenaar ALOGE("dvrGetNamedBuffer: Invalid inputs: name=%p, out_buffer=%p.", name, 70eaa5522feac452703a0836310047d4b15702487dHendrik Wagenaar out_buffer); 71eaa5522feac452703a0836310047d4b15702487dHendrik Wagenaar return -EINVAL; 72eaa5522feac452703a0836310047d4b15702487dHendrik Wagenaar } 73eaa5522feac452703a0836310047d4b15702487dHendrik Wagenaar 74eaa5522feac452703a0836310047d4b15702487dHendrik Wagenaar auto named_buffer = client->GetNamedBuffer(name); 75eaa5522feac452703a0836310047d4b15702487dHendrik Wagenaar if (!named_buffer) { 76eaa5522feac452703a0836310047d4b15702487dHendrik Wagenaar ALOGE("dvrGetNamedBuffer: Failed to find named buffer: %s.", name); 77eaa5522feac452703a0836310047d4b15702487dHendrik Wagenaar return -EINVAL; 78eaa5522feac452703a0836310047d4b15702487dHendrik Wagenaar } 79eaa5522feac452703a0836310047d4b15702487dHendrik Wagenaar *out_buffer = CreateDvrBufferFromIonBuffer(std::move(named_buffer)); 80bdcee79b0d7e87cb48049907a7ba8201d0288f75Jiwen 'Steve' Cai return 0; 81bdcee79b0d7e87cb48049907a7ba8201d0288f75Jiwen 'Steve' Cai} 82bdcee79b0d7e87cb48049907a7ba8201d0288f75Jiwen 'Steve' Cai 83bdcee79b0d7e87cb48049907a7ba8201d0288f75Jiwen 'Steve' Cai} // extern "C" 84