123456789101112131415161718192021222324252627282930313233343536373839404142434445464748495051525354555657585960616263646566676869707172737475767778798081828384858687888990919293949596979899100101102103 |
- #include "mp4_mp4v_decoder.h"
- #include "../winamp/wa_ipc.h"
- MP4VMP4Decoder::MP4VMP4Decoder()
- {
-
- }
- MP4VMP4Decoder::~MP4VMP4Decoder()
- {
-
- }
- int MP4VMP4Decoder::Open(MP4FileHandle mp4_file, MP4TrackId mp4_track)
- {
- HRESULT hr;
- VIDEOINFOHEADER header = {0, };
- header.bmiHeader.biHeight = MP4GetTrackVideoHeight(mp4_file, mp4_track);
- header.bmiHeader.biWidth = MP4GetTrackVideoWidth(mp4_file, mp4_track);
- header.bmiHeader.biCompression = 'v4pm';
- hr = decoder.Open(&header);
- if (FAILED(hr)) {
- return MP4_VIDEO_FAILURE;
- }
- uint8_t *buffer = 0;
- uint32_t buffer_size = 0;
- if (MP4GetTrackESConfiguration(mp4_file, mp4_track, &buffer, &buffer_size)
- && buffer && buffer_size) {
- hr = decoder.Feed(buffer, buffer_size, 0);
- MP4Free(buffer);
- if (FAILED(hr)) {
- return MP4_VIDEO_FAILURE;
- }
- }
- return MP4_VIDEO_SUCCESS;
- }
- int MP4VMP4Decoder::GetOutputFormat(int *x, int *y, int *color_format, double *aspect_ratio)
- {
- UINT width, height;
- bool local_flip=false;
- if (SUCCEEDED(decoder.GetOutputFormat(&width, &height, &local_flip, aspect_ratio))) {
- *x = width;
- *y = height;
- *color_format = '21VY';
- return MP4_VIDEO_SUCCESS;
- }
- return MP4_VIDEO_FAILURE;
- }
- int MP4VMP4Decoder::DecodeSample(const void *inputBuffer, size_t inputBufferBytes, MP4Timestamp timestamp)
- {
- HRESULT hr;
- hr=decoder.Feed(inputBuffer, inputBufferBytes, timestamp);
- return MP4_VIDEO_SUCCESS;
- }
- int MP4VMP4Decoder::CanHandleCodec(const char *codecName)
- {
- return !strcmp(codecName, "mp4v");
- }
- void MP4VMP4Decoder::Flush()
- {
- decoder.Flush();
- }
- int MP4VMP4Decoder::GetPicture(void **data, void **decoder_data, MP4Timestamp *timestamp)
- {
- if (SUCCEEDED(decoder.GetFrame((YV12_PLANES **)data, decoder_data, timestamp))) {
- return MP4_VIDEO_SUCCESS;
- } else {
- return MP4_VIDEO_FAILURE;
- }
- }
- void MP4VMP4Decoder::FreePicture(void *data, void *decoder_data)
- {
- decoder.FreeFrame((YV12_PLANES *)data, decoder_data);
- }
- void MP4VMP4Decoder::Close()
- {
- }
- #define CBCLASS MP4VMP4Decoder
- START_DISPATCH;
- CB(MPEG4_VIDEO_OPEN, Open)
- CB(MPEG4_VIDEO_GETOUTPUTFORMAT, GetOutputFormat)
- CB(MPEG4_VIDEO_DECODE, DecodeSample)
- CB(MPEG4_VIDEO_HANDLES_CODEC, CanHandleCodec)
- VCB(MPEG4_VIDEO_FLUSH, Flush)
- CB(MPEG4_VIDEO_GET_PICTURE, GetPicture)
- VCB(MPEG4_VIDEO_FREE_PICTURE, FreePicture)
- VCB(MPEG4_VIDEO_CLOSE, Close)
- END_DISPATCH;
- #undef CBCLASS
|