aboutsummaryrefslogtreecommitdiffstats
path: root/src/jogl/native/libav
diff options
context:
space:
mode:
Diffstat (limited to 'src/jogl/native/libav')
-rw-r--r--src/jogl/native/libav/ffmpeg_dshow.h6
-rw-r--r--src/jogl/native/libav/ffmpeg_impl_template.c121
-rw-r--r--src/jogl/native/libav/ffmpeg_static.c57
3 files changed, 86 insertions, 98 deletions
diff --git a/src/jogl/native/libav/ffmpeg_dshow.h b/src/jogl/native/libav/ffmpeg_dshow.h
index e4ef7096b..44524bf4b 100644
--- a/src/jogl/native/libav/ffmpeg_dshow.h
+++ b/src/jogl/native/libav/ffmpeg_dshow.h
@@ -26,8 +26,8 @@
* or implied, of JogAmp Community.
*/
-#ifndef _FFMPEG_TOOL_H
-#define _FFMPEG_TOOL_H
+#ifndef _FFMPEG_DSHOW_H
+#define _FFMPEG_DSHOW_H
#ifdef _WIN32
@@ -43,5 +43,5 @@
extern int findDShowVideoDevice(char * dest, int destSize, int devIdx, int verbose);
-#endif // _FFMPEG_TOOL_H
+#endif // _FFMPEG_DSHOW_H
diff --git a/src/jogl/native/libav/ffmpeg_impl_template.c b/src/jogl/native/libav/ffmpeg_impl_template.c
index c58750e0f..34a2baeb7 100644
--- a/src/jogl/native/libav/ffmpeg_impl_template.c
+++ b/src/jogl/native/libav/ffmpeg_impl_template.c
@@ -30,6 +30,7 @@
#include "JoglCommon.h"
#include "ffmpeg_tool.h"
+#include "ffmpeg_static.h"
#include "ffmpeg_dshow.h"
#include "libavutil/pixdesc.h"
@@ -41,15 +42,6 @@
#include <GL/gl.h>
-static const char * const ClazzNameFFMPEGMediaPlayer = "jogamp/opengl/util/av/impl/FFMPEGMediaPlayer";
-
-static jclass ffmpegMediaPlayerClazz = NULL;
-static jmethodID jni_mid_pushSound = NULL;
-static jmethodID jni_mid_updateAttributes = NULL;
-static jmethodID jni_mid_setIsGLOriented = NULL;
-static jmethodID jni_mid_setupFFAttributes = NULL;
-static jmethodID jni_mid_isAudioFormatSupported = NULL;
-
#define HAS_FUNC(f) (NULL!=(f))
typedef unsigned (APIENTRYP AVUTIL_VERSION)(void);
@@ -307,21 +299,37 @@ JNIEXPORT jboolean JNICALL FF_FUNC(initSymbols0)
return JNI_FALSE;
}
+ #if LIBAVCODEC_VERSION_MAJOR >= 55
+ if(!HAS_FUNC(sp_avcodec_default_get_buffer2) ||
+ !HAS_FUNC(sp_av_frame_unref) ) {
+ fprintf(stderr, "avcodec >= 55: avcodec_default_get_buffer2 %p, av_frame_unref %p\n",
+ sp_avcodec_default_get_buffer2, sp_av_frame_unref);
+ return JNI_FALSE;
+ }
+ #else
+ if(!HAS_FUNC(sp_avcodec_default_get_buffer) ||
+ !HAS_FUNC(sp_avcodec_default_release_buffer)) {
+ fprintf(stderr, "avcodec < 55: avcodec_default_get_buffer %p, sp_avcodec_default_release_buffer %p\n",
+ sp_avcodec_default_get_buffer2, sp_avcodec_default_release_buffer);
+ return JNI_FALSE;
+ }
+ #endif
+
return JNI_TRUE;
}
static int _isAudioFormatSupported(JNIEnv *env, jobject ffmpegMediaPlayer, enum AVSampleFormat aSampleFmt, int32_t aSampleRate, int32_t aChannels) {
- return JNI_TRUE == (*env)->CallBooleanMethod(env, ffmpegMediaPlayer, jni_mid_isAudioFormatSupported, aSampleFmt, aSampleRate, aChannels);
+ return JNI_TRUE == (*env)->CallBooleanMethod(env, ffmpegMediaPlayer, ffmpeg_jni_mid_isAudioFormatSupported, aSampleFmt, aSampleRate, aChannels);
}
static void _updateJavaAttributes(JNIEnv *env, FFMPEGToolBasicAV_t* pAV) {
if(NULL!=env) {
- (*env)->CallVoidMethod(env, pAV->ffmpegMediaPlayer, jni_mid_setupFFAttributes,
+ (*env)->CallVoidMethod(env, pAV->ffmpegMediaPlayer, ffmpeg_jni_mid_setupFFAttributes,
pAV->vid, pAV->vPixFmt, pAV->vBufferPlanes,
pAV->vBitsPerPixel, pAV->vBytesPerPixelPerPlane,
pAV->vTexWidth[0], pAV->vTexWidth[1], pAV->vTexWidth[2],
pAV->vWidth, pAV->vHeight,
pAV->aid, pAV->aSampleFmtOut, pAV->aSampleRateOut, pAV->aChannelsOut, pAV->aFrameSize);
- (*env)->CallVoidMethod(env, pAV->ffmpegMediaPlayer, jni_mid_updateAttributes,
+ (*env)->CallVoidMethod(env, pAV->ffmpegMediaPlayer, ffmpeg_jni_mid_updateAttributes,
pAV->vid, pAV->aid,
pAV->vWidth, pAV->vHeight,
pAV->bps_stream, pAV->bps_video, pAV->bps_audio,
@@ -332,7 +340,7 @@ static void _updateJavaAttributes(JNIEnv *env, FFMPEGToolBasicAV_t* pAV) {
}
static void _setIsGLOriented(JNIEnv *env, FFMPEGToolBasicAV_t* pAV) {
if(NULL!=env) {
- (*env)->CallVoidMethod(env, pAV->ffmpegMediaPlayer, jni_mid_setIsGLOriented, pAV->vFlipped);
+ (*env)->CallVoidMethod(env, pAV->ffmpegMediaPlayer, ffmpeg_jni_mid_setIsGLOriented, pAV->vFlipped);
}
}
@@ -428,11 +436,11 @@ static int my_getPlaneCount(AVPixFmtDescriptor *pDesc) {
return p+1;
}
+#if 0
static int my_is_hwaccel_pix_fmt(enum PixelFormat pix_fmt) {
return sp_av_pix_fmt_descriptors[pix_fmt].flags & PIX_FMT_HWACCEL;
}
-#if 0
static enum PixelFormat my_get_format(struct AVCodecContext *s, const enum PixelFormat * fmt) {
int i=0;
enum PixelFormat f0, fR = PIX_FMT_NONE;
@@ -479,58 +487,6 @@ JNIEXPORT jint JNICALL FF_FUNC(getSwResampleMajorVersionCC0)
return (jint) LIBSWRESAMPLE_VERSION_MAJOR;
}
-JNIEXPORT jboolean JNICALL FF_FUNC(initIDs0)
- (JNIEnv *env, jobject instance)
-{
- jboolean res = JNI_TRUE;
- JoglCommon_init(env);
-
- jclass c;
- if (ffmpegMediaPlayerClazz != NULL) {
- return;
- }
-
- c = (*env)->FindClass(env, ClazzNameFFMPEGMediaPlayer);
- if(NULL==c) {
- JoglCommon_FatalError(env, "JOGL FFMPEG: can't find %s", ClazzNameFFMPEGMediaPlayer);
- }
- ffmpegMediaPlayerClazz = (jclass)(*env)->NewGlobalRef(env, c);
- (*env)->DeleteLocalRef(env, c);
- if(NULL==ffmpegMediaPlayerClazz) {
- JoglCommon_FatalError(env, "JOGL FFMPEG: can't use %s", ClazzNameFFMPEGMediaPlayer);
- }
-
- jni_mid_pushSound = (*env)->GetMethodID(env, ffmpegMediaPlayerClazz, "pushSound", "(Ljava/nio/ByteBuffer;II)V");
- jni_mid_updateAttributes = (*env)->GetMethodID(env, ffmpegMediaPlayerClazz, "updateAttributes", "(IIIIIIIFIIILjava/lang/String;Ljava/lang/String;)V");
- jni_mid_setIsGLOriented = (*env)->GetMethodID(env, ffmpegMediaPlayerClazz, "setIsGLOriented", "(Z)V");
- jni_mid_setupFFAttributes = (*env)->GetMethodID(env, ffmpegMediaPlayerClazz, "setupFFAttributes", "(IIIIIIIIIIIIIII)V");
- jni_mid_isAudioFormatSupported = (*env)->GetMethodID(env, ffmpegMediaPlayerClazz, "isAudioFormatSupported", "(III)Z");
-
- if(jni_mid_pushSound == NULL ||
- jni_mid_updateAttributes == NULL ||
- jni_mid_setIsGLOriented == NULL ||
- jni_mid_setupFFAttributes == NULL ||
- jni_mid_isAudioFormatSupported == NULL) {
- return JNI_FALSE;
- }
- #if LIBAVCODEC_VERSION_MAJOR >= 55
- if(!HAS_FUNC(sp_avcodec_default_get_buffer2) ||
- !HAS_FUNC(sp_av_frame_unref) ) {
- fprintf(stderr, "avcodec >= 55: avcodec_default_get_buffer2 %p, av_frame_unref %p\n",
- sp_avcodec_default_get_buffer2, sp_av_frame_unref);
- res = JNI_FALSE;
- }
- #else
- if(!HAS_FUNC(sp_avcodec_default_get_buffer) ||
- !HAS_FUNC(sp_avcodec_default_release_buffer)) {
- fprintf(stderr, "avcodec < 55: avcodec_default_get_buffer %p, sp_avcodec_default_release_buffer %p\n",
- sp_avcodec_default_get_buffer2, sp_avcodec_default_release_buffer);
- res = JNI_FALSE;
- }
- #endif
- return res;
-}
-
JNIEXPORT jlong JNICALL FF_FUNC(createInstance0)
(JNIEnv *env, jobject instance, jobject ffmpegMediaPlayer, jboolean verbose)
{
@@ -890,7 +846,7 @@ JNIEXPORT void JNICALL FF_FUNC(setStream0)
pAV->frames_audio = pAV->pAStream->nb_frames;
pAV->aSinkSupport = _isAudioFormatSupported(env, pAV->ffmpegMediaPlayer, pAV->aSampleFmt, pAV->aSampleRate, pAV->aChannels);
if( pAV->verbose ) {
- fprintf(stderr, "A channels %d [l %d], sample_rate %d, frame_size %d, frame_number %d, [afps %f, rfps %f, cfps %f, sfps %f], nb_frames %d, [maxChan %d, prefRate %d, req_chan_layout %d, req_chan %d], sink-support %d \n",
+ fprintf(stderr, "A channels %d [l %"PRId64"], sample_rate %d, frame_size %d, frame_number %d, [afps %f, rfps %f, cfps %f, sfps %f], nb_frames %"PRId64", [maxChan %d, prefRate %d, req_chan_layout %"PRId64", req_chan %d], sink-support %d \n",
pAV->aChannels, pAV->pACodecCtx->channel_layout, pAV->aSampleRate, pAV->aFrameSize, pAV->pACodecCtx->frame_number,
my_av_q2f(pAV->pAStream->avg_frame_rate),
#if LIBAVCODEC_VERSION_MAJOR < 55
@@ -1074,7 +1030,7 @@ JNIEXPORT void JNICALL FF_FUNC(setStream0)
}
if( pAV->verbose ) {
- fprintf(stderr, "V frame_size %d, frame_number %d, [afps %f, rfps %f, cfps %f, sfps %f] -> %f fps, nb_frames %d, size %dx%d, fmt 0x%X, bpp %d, planes %d, codecCaps 0x%X\n",
+ fprintf(stderr, "V frame_size %d, frame_number %d, [afps %f, rfps %f, cfps %f, sfps %f] -> %f fps, nb_frames %"PRId64", size %dx%d, fmt 0x%X, bpp %d, planes %d, codecCaps 0x%X\n",
pAV->pVCodecCtx->frame_size, pAV->pVCodecCtx->frame_number,
my_av_q2f(pAV->pVStream->avg_frame_rate),
#if LIBAVCODEC_VERSION_MAJOR < 55
@@ -1202,14 +1158,13 @@ JNIEXPORT jint JNICALL FF_FUNC(readNextPacket0)
// Decode audio frame
if(NULL == pAV->pAFrames) { // no audio registered
sp_av_free_packet(&packet);
- return 0;
+ return INVALID_PTS;
}
int frameCount;
int flush_complete = 0;
for ( frameCount=0; 0 < packet.size || 0 == frameCount; frameCount++ ) {
int frameDecoded;
int len1;
- NIOBuffer_t * pNIOBufferCurrent = &pAV->pANIOBuffers[pAV->aFrameCurrent];
AVFrame* pAFrameCurrent = pAV->pAFrames[pAV->aFrameCurrent];
if( pAV->useRefCountedFrames ) {
sp_av_frame_unref(pAFrameCurrent);
@@ -1261,7 +1216,7 @@ JNIEXPORT jint JNICALL FF_FUNC(readNextPacket0)
if( pAV->verbose ) {
int32_t aDTS = my_av_q2i32( pAFrameCurrent->pkt_dts * 1000, time_base);
- fprintf(stderr, "A pts %d [pkt_pts %ld], dts %d [pkt_dts %ld], f# %d, aFrame %d/%d %p, dataPtr %p, dataSize %d\n",
+ fprintf(stderr, "A pts %d [pkt_pts %"PRId64"], dts %d [pkt_dts %"PRId64"], f# %d, aFrame %d/%d %p, dataPtr %p, dataSize %d\n",
pAV->aPTS, pkt_pts, aDTS, pAFrameCurrent->pkt_dts, frameCount,
pAV->aFrameCurrent, pAV->aFrameCount, pAFrameCurrent, pAFrameCurrent->data[0], data_size);
}
@@ -1269,12 +1224,8 @@ JNIEXPORT jint JNICALL FF_FUNC(readNextPacket0)
void* data_ptr = pAFrameCurrent->data[0]; // default
if( NULL != pAV->avResampleCtx || NULL != pAV->swResampleCtx ) {
- enum AVSampleFormat aSampleFmtOut; // out fmt
- int32_t aChannelsOut;
- int32_t aSampleRateOut;
-
uint8_t *tmp_out;
- int out_samples, out_size, out_linesize;
+ int out_samples=-1, out_size, out_linesize;
int osize = sp_av_get_bytes_per_sample( pAV->aSampleFmtOut );
int nb_samples = pAFrameCurrent->nb_samples;
@@ -1286,7 +1237,7 @@ JNIEXPORT jint JNICALL FF_FUNC(readNextPacket0)
tmp_out = sp_av_realloc(pAV->aResampleBuffer, out_size);
if (!tmp_out) {
JoglCommon_throwNewRuntimeException(env, "Couldn't alloc resample buffer of size %d", out_size);
- return;
+ return INVALID_PTS;
}
pAV->aResampleBuffer = tmp_out;
@@ -1304,7 +1255,7 @@ JNIEXPORT jint JNICALL FF_FUNC(readNextPacket0)
}
if (out_samples < 0) {
JoglCommon_throwNewRuntimeException(env, "avresample_convert() failed");
- return;
+ return INVALID_PTS;
}
data_size = out_samples * osize * pAV->aChannelsOut;
data_ptr = tmp_out;
@@ -1329,14 +1280,14 @@ JNIEXPORT jint JNICALL FF_FUNC(readNextPacket0)
pNIOBufferCurrent->origPtr, pNIOBufferCurrent->nioRef, pNIOBufferCurrent->size);
}
}
- (*env)->CallVoidMethod(env, pAV->ffmpegMediaPlayer, jni_mid_pushSound, pNIOBufferCurrent->nioRef, data_size, pAV->aPTS);
+ (*env)->CallVoidMethod(env, pAV->ffmpegMediaPlayer, ffmpeg_jni_mid_pushSound, pNIOBufferCurrent->nioRef, data_size, pAV->aPTS);
}
}
} else if(packet.stream_index==pAV->vid) {
// Decode video frame
if(NULL == pAV->pVFrame) {
sp_av_free_packet(&packet);
- return 0;
+ return INVALID_PTS;
}
int frameCount;
int flush_complete = 0;
@@ -1384,7 +1335,7 @@ JNIEXPORT jint JNICALL FF_FUNC(readNextPacket0)
const char * warn = frame_repeat_i > 0 ? "REPEAT" : "NORMAL" ;
- fprintf(stderr, "V fix_pts %d, pts %d [pkt_pts %ld], dts %d [pkt_dts %ld], time d(%lf s + r %lf = %lf s), i(%d ms + r %d = %d ms) - %s - f# %d, dec %d, data %p, lsz %d\n",
+ fprintf(stderr, "V fix_pts %d, pts %d [pkt_pts %"PRId64"], dts %d [pkt_dts %"PRId64"], time d(%lf s + r %lf = %lf s), i(%d ms + r %d = %d ms) - %s - f# %d, dec %d, data %p, lsz %d\n",
pAV->vPTS, vPTS, pkt_pts, vDTS, pkt_dts,
frame_delay_d, frame_repeat_d, (frame_delay_d + frame_repeat_d),
frame_delay_i, frame_repeat_i, (frame_delay_i + frame_repeat_i), warn, frameCount,
@@ -1546,7 +1497,7 @@ JNIEXPORT jint JNICALL FF_FUNC(seek0)
int64_t pts1 = (int64_t) (pos1 * (int64_t) time_base.den)
/ (1000 * (int64_t) time_base.num);
if(pAV->verbose) {
- fprintf(stderr, "SEEK: vid %d, aid %d, pos1 %d, pts: %ld -> %ld\n", pAV->vid, pAV->aid, pos1, pts0, pts1);
+ fprintf(stderr, "SEEK: vid %d, aid %d, pos1 %d, pts: %"PRId64" -> %"PRId64"\n", pAV->vid, pAV->aid, pos1, pts0, pts1);
}
int flags = 0;
if(pos1 < pos0) {
@@ -1555,7 +1506,7 @@ JNIEXPORT jint JNICALL FF_FUNC(seek0)
int res;
if(HAS_FUNC(sp_av_seek_frame)) {
if(pAV->verbose) {
- fprintf(stderr, "SEEK.0: pre : s %ld / %ld -> t %d / %ld\n", pos0, pts0, pos1, pts1);
+ fprintf(stderr, "SEEK.0: pre : s %"PRId64" / %"PRId64" -> t %d / %"PRId64"\n", pos0, pts0, pos1, pts1);
}
sp_av_seek_frame(pAV->pFormatCtx, streamID, pts1, flags);
} else if(HAS_FUNC(sp_avformat_seek_file)) {
@@ -1563,7 +1514,7 @@ JNIEXPORT jint JNICALL FF_FUNC(seek0)
int64_t seek_min = ptsD > 0 ? pts1 - ptsD : INT64_MIN;
int64_t seek_max = ptsD < 0 ? pts1 - ptsD : INT64_MAX;
if(pAV->verbose) {
- fprintf(stderr, "SEEK.1: pre : s %ld / %ld -> t %d / %ld [%ld .. %ld]\n",
+ fprintf(stderr, "SEEK.1: pre : s %"PRId64" / %"PRId64" -> t %d / %"PRId64" [%"PRId64" .. %"PRId64"]\n",
pos0, pts0, pos1, pts1, seek_min, seek_max);
}
res = sp_avformat_seek_file(pAV->pFormatCtx, -1, seek_min, pts1, seek_max, flags);
@@ -1576,7 +1527,7 @@ JNIEXPORT jint JNICALL FF_FUNC(seek0)
}
const jint rPTS = my_av_q2i32( ( pAV->vid >= 0 ? pAV->pVFrame->pkt_pts : pAV->pAFrames[pAV->aFrameCurrent]->pkt_pts ) * 1000, time_base);
if(pAV->verbose) {
- fprintf(stderr, "SEEK: post : res %d, u %ld\n", res, rPTS);
+ fprintf(stderr, "SEEK: post : res %d, u %d\n", res, rPTS);
}
return rPTS;
}
diff --git a/src/jogl/native/libav/ffmpeg_static.c b/src/jogl/native/libav/ffmpeg_static.c
index be5bc00b7..c8af59540 100644
--- a/src/jogl/native/libav/ffmpeg_static.c
+++ b/src/jogl/native/libav/ffmpeg_static.c
@@ -26,23 +26,60 @@
* or implied, of JogAmp Community.
*/
-#ifdef _WIN32
- #include <windows.h>
-#endif
-
-#include <gluegen_stdint.h>
-#include <gluegen_inttypes.h>
-#include <gluegen_stddef.h>
-#include <gluegen_stdint.h>
-
-#include "jogamp_opengl_util_av_impl_FFMPEGStaticNatives.h"
+#include "ffmpeg_static.h"
#include "JoglCommon.h"
#include <GL/gl-platform.h>
+static const char * const ClazzNameFFMPEGMediaPlayer = "jogamp/opengl/util/av/impl/FFMPEGMediaPlayer";
+
+static jclass ffmpegMediaPlayerClazz = NULL;
+jmethodID ffmpeg_jni_mid_pushSound = NULL;
+jmethodID ffmpeg_jni_mid_updateAttributes = NULL;
+jmethodID ffmpeg_jni_mid_setIsGLOriented = NULL;
+jmethodID ffmpeg_jni_mid_setupFFAttributes = NULL;
+jmethodID ffmpeg_jni_mid_isAudioFormatSupported = NULL;
+
typedef unsigned (APIENTRYP AV_GET_VERSION)(void);
+JNIEXPORT jboolean JNICALL Java_jogamp_opengl_util_av_impl_FFMPEGStaticNatives_initIDs0
+ (JNIEnv *env, jclass clazz)
+{
+ jboolean res = JNI_TRUE;
+ JoglCommon_init(env);
+
+ jclass c;
+ if (ffmpegMediaPlayerClazz != NULL) {
+ return JNI_FALSE;
+ }
+
+ c = (*env)->FindClass(env, ClazzNameFFMPEGMediaPlayer);
+ if(NULL==c) {
+ JoglCommon_FatalError(env, "JOGL FFMPEG: can't find %s", ClazzNameFFMPEGMediaPlayer);
+ }
+ ffmpegMediaPlayerClazz = (jclass)(*env)->NewGlobalRef(env, c);
+ (*env)->DeleteLocalRef(env, c);
+ if(NULL==ffmpegMediaPlayerClazz) {
+ JoglCommon_FatalError(env, "JOGL FFMPEG: can't use %s", ClazzNameFFMPEGMediaPlayer);
+ }
+
+ ffmpeg_jni_mid_pushSound = (*env)->GetMethodID(env, ffmpegMediaPlayerClazz, "pushSound", "(Ljava/nio/ByteBuffer;II)V");
+ ffmpeg_jni_mid_updateAttributes = (*env)->GetMethodID(env, ffmpegMediaPlayerClazz, "updateAttributes", "(IIIIIIIFIIILjava/lang/String;Ljava/lang/String;)V");
+ ffmpeg_jni_mid_setIsGLOriented = (*env)->GetMethodID(env, ffmpegMediaPlayerClazz, "setIsGLOriented", "(Z)V");
+ ffmpeg_jni_mid_setupFFAttributes = (*env)->GetMethodID(env, ffmpegMediaPlayerClazz, "setupFFAttributes", "(IIIIIIIIIIIIIII)V");
+ ffmpeg_jni_mid_isAudioFormatSupported = (*env)->GetMethodID(env, ffmpegMediaPlayerClazz, "isAudioFormatSupported", "(III)Z");
+
+ if(ffmpeg_jni_mid_pushSound == NULL ||
+ ffmpeg_jni_mid_updateAttributes == NULL ||
+ ffmpeg_jni_mid_setIsGLOriented == NULL ||
+ ffmpeg_jni_mid_setupFFAttributes == NULL ||
+ ffmpeg_jni_mid_isAudioFormatSupported == NULL) {
+ return JNI_FALSE;
+ }
+ return res;
+}
+
JNIEXPORT jint JNICALL Java_jogamp_opengl_util_av_impl_FFMPEGStaticNatives_getAvVersion0
(JNIEnv *env, jclass clazz, jlong func) {
if( 0 != func ) {