1. static int ffplay_video_thread(void *arg)
  2. {
  3. FFPlayer *ffp = arg;
  4. VideoState *is = ffp->is;
  5. AVFrame *frame = av_frame_alloc();
  6. ...
  7. for (;;) {
  8. ret = get_video_frame(ffp, frame);
  9. ...
  10. ret = queue_picture(ffp, frame, pts, duration, av_frame_get_pkt_pos(frame), is->viddec.pkt_serial);
  11. av_frame_unref(frame);
  12. #if CONFIG_AVFILTER
  13. }
  14. ...
  15.  
  16. /* alloc or resize hardware picture buffer */
  17. if (!vp->bmp || !vp->allocated ||
  18. vp->width != src_frame->width ||
  19. vp->height != src_frame->height ||
  20. vp->format != src_frame->format) {
  21.  
  22. if (vp->width != src_frame->width || vp->height != src_frame->height)
  23. ffp_notify_msg3(ffp, FFP_MSG_VIDEO_SIZE_CHANGED, src_frame->width, src_frame->height);
  24.  
  25. vp->allocated = ;
  26. vp->width = src_frame->width;
  27. vp->height = src_frame->height;
  28. vp->format = src_frame->format;
  29.  
  30. /* the allocation must be done in the main thread to avoid
  31. locking problems. */
  32. alloc_picture(ffp, src_frame->format);
  33.  
  34. if (is->videoq.abort_request)
  35. return -;
  36. }
  37.  
  38. /* if the frame is not skipped, then display it */
  39. if (vp->bmp) {
  40. /* get a pointer on the bitmap */
  41. SDL_VoutLockYUVOverlay(vp->bmp);
  42.  
  43. #ifdef FFP_MERGE
  44. #if CONFIG_AVFILTER
  45. // FIXME use direct rendering
  46. av_image_copy(data, linesize, (const uint8_t **)src_frame->data, src_frame->linesize,
  47. src_frame->format, vp->width, vp->height);
  48. #else
  49. // sws_getCachedContext(...);
  50. #endif
  51. #endif
  52. // FIXME: set swscale options
  53. if (SDL_VoutFillFrameYUVOverlay(vp->bmp, src_frame) < ) {
  54. av_log(NULL, AV_LOG_FATAL, "Cannot initialize the conversion context\n");
  55. exit();
  56. }
  57.  
  58. ...
  59.  
  60. static void alloc_picture(FFPlayer *ffp, int frame_format)
  61. {
  62. VideoState *is = ffp->is;
  63. Frame *vp;
  64. #ifdef FFP_MERGE
  65. int sdl_format;
  66. #endif
  67.  
  68. vp = &is->pictq.queue[is->pictq.windex];
  69.  
  70. free_picture(vp);
  71.  
  72. #ifdef FFP_MERGE
  73. video_open(is, vp);
  74. #endif
  75.  
  76. SDL_VoutSetOverlayFormat(ffp->vout, ffp->overlay_format);
  77. vp->bmp = SDL_Vout_CreateOverlay(vp->width, vp->height,
  78. frame_format,
  79. ffp->vout);
  80. ...
  81.  
  82. int SDL_VoutFillFrameYUVOverlay(SDL_VoutOverlay *overlay, const AVFrame *frame)
  83. {
  84. if (!overlay || !overlay->func_fill_frame)
  85. return -;
  86.  
  87. return overlay->func_fill_frame(overlay, frame);
  88. }
  89.  
  90. static int get_video_frame(FFPlayer *ffp, AVFrame *frame)
  91. {
  92. VideoState *is = ffp->is;
  93. int got_picture;
  94.  
  95. ffp_video_statistic_l(ffp);
  96. if ((got_picture = decoder_decode_frame(ffp, &is->viddec, frame, NULL)) < )
  97. return -;
  98.  
  99. ...

rindex

  1. /* called to display each frame */
  2. static void video_refresh(FFPlayer *opaque, double *remaining_time)
  3. {
  4. ..
  5. display:
  6. /* display picture */
  7. if (!ffp->display_disable && is->force_refresh && is->show_mode == SHOW_MODE_VIDEO && is->pictq.rindex_shown)
  8. video_display2(ffp);
  9. ...
  10.  
  11. /* display the current picture, if any */
  12. static void video_display2(FFPlayer *ffp)
  13. {
  14. VideoState *is = ffp->is;
  15. if (is->video_st)
  16. video_image_display2(ffp);
  17. }
  18.  
  19. static void video_image_display2(FFPlayer *ffp)
  20. {
  21. VideoState *is = ffp->is;
  22. Frame *vp;
  23. Frame *sp = NULL;
  24.  
  25. vp = frame_queue_peek_last(&is->pictq);
  26.  
  27. int latest_seek_load_serial = __atomic_exchange_n(&(is->latest_seek_load_serial), -, memory_order_seq_cst);
  28. if (latest_seek_load_serial == vp->serial)
  29. ffp->stat.latest_seek_load_duration = (av_gettime() - is->latest_seek_load_start_at) / ;
  30.  
  31. if (vp->bmp) {
  32. if (is->subtitle_st) {
  33. if (frame_queue_nb_remaining(&is->subpq) > ) {
  34. sp = frame_queue_peek(&is->subpq);
  35.  
  36. if (vp->pts >= sp->pts + ((float) sp->sub.start_display_time / )) {
  37. if (!sp->uploaded) {
  38. if (sp->sub.num_rects > ) {
  39. char buffered_text[];
  40. if (sp->sub.rects[]->text) {
  41. strncpy(buffered_text, sp->sub.rects[]->text, );
  42. }
  43. else if (sp->sub.rects[]->ass) {
  44. parse_ass_subtitle(sp->sub.rects[]->ass, buffered_text);
  45. }
  46. ffp_notify_msg4(ffp, FFP_MSG_TIMED_TEXT, , , buffered_text, sizeof(buffered_text));
  47. }
  48. sp->uploaded = ;
  49. }
  50. }
  51. }
  52. }
  53. SDL_VoutDisplayYUVOverlay(ffp->vout, vp->bmp);
  54. ffp->stat.vfps = SDL_SpeedSamplerAdd(&ffp->vfps_sampler, FFP_SHOW_VFPS_FFPLAY, "vfps[ffplay]");
  55. if (!ffp->first_video_frame_rendered) {
  56. ffp->first_video_frame_rendered = ;
  57. ffp_notify_msg1(ffp, FFP_MSG_VIDEO_RENDERING_START);
  58. }
  59. }
  60. }
  61.  
  62. static Frame *frame_queue_peek_last(FrameQueue *f)
  63. {
  64. return &f->queue[f->rindex];
  65. }

1.

  1. static int func_fill_frame(SDL_VoutOverlay *overlay, const AVFrame *frame)
  2. {
  3. assert(overlay);
  4. SDL_VoutOverlay_Opaque *opaque = overlay->opaque;
  5. AVFrame swscale_dst_pic = { { } };
  6.  
  7. av_frame_unref(opaque->linked_frame);
  8.  
  9. int need_swap_uv = ;
  10. int use_linked_frame = ;
  11. enum AVPixelFormat dst_format = AV_PIX_FMT_NONE;
  12. switch (overlay->format) {
  13. case SDL_FCC_YV12:
  14. need_swap_uv = ;
  15. // no break;
  16. case SDL_FCC_I420:
  17. if (frame->format == AV_PIX_FMT_YUV420P || frame->format == AV_PIX_FMT_YUVJ420P) {
  18. // ALOGE("direct draw frame");
  19. use_linked_frame = ;
  20. dst_format = frame->format;
  21. } else {
  22. // ALOGE("copy draw frame");
  23. dst_format = AV_PIX_FMT_YUV420P;
  24. }
  25. break;
  26. case SDL_FCC_I444P10LE:
  27. if (frame->format == AV_PIX_FMT_YUV444P10LE) {
  28. // ALOGE("direct draw frame");
  29. use_linked_frame = ;
  30. dst_format = frame->format;
  31. } else {
  32. // ALOGE("copy draw frame");
  33. dst_format = AV_PIX_FMT_YUV444P10LE;
  34. }
  35. break;
  36. case SDL_FCC_RV32:
  37. dst_format = AV_PIX_FMT_0BGR32;
  38. break;
  39. case SDL_FCC_RV24:
  40. dst_format = AV_PIX_FMT_RGB24;
  41. break;
  42. case SDL_FCC_RV16:
  43. dst_format = AV_PIX_FMT_RGB565;
  44. break;
  45. default:
  46. ALOGE("SDL_VoutFFmpeg_ConvertPicture: unexpected overlay format %s(%d)",
  47. (char*)&overlay->format, overlay->format);
  48. return -;
  49. }
  50.  
  51. // setup frame
  52. if (use_linked_frame) {
  53. // linked frame
  54. av_frame_ref(opaque->linked_frame, frame);
  55.  
  56. overlay_fill(overlay, opaque->linked_frame, opaque->planes);
  57.  
  58. ...
  59.  
  60. static void overlay_fill(SDL_VoutOverlay *overlay, AVFrame *frame, int planes)
  61. {
  62. overlay->planes = planes;
  63.  
  64. for (int i = ; i < AV_NUM_DATA_POINTERS; ++i) {
  65. overlay->pixels[i] = frame->data[i];
  66. overlay->pitches[i] = frame->linesize[i];
  67. }
  68. }
  69. ...
  70.  
  71. static GLboolean yuv420p_uploadTexture(IJK_GLES2_Renderer *renderer, SDL_VoutOverlay *overlay)
  72. {
  73. if (!renderer || !overlay)
  74. return GL_FALSE;
  75.  
  76. int planes[] = { , , };
  77. const GLsizei widths[] = { overlay->pitches[], overlay->pitches[], overlay->pitches[] };
  78. const GLsizei heights[] = { overlay->h, overlay->h / , overlay->h / };
  79. const GLubyte *pixels[] = { overlay->pixels[], overlay->pixels[], overlay->pixels[] };
  80.  
  81. switch (overlay->format) {
  82. case SDL_FCC_I420:
  83. break;
  84. case SDL_FCC_YV12:
  85. planes[] = ;
  86. planes[] = ;
  87. break;
  88. default:
  89. ALOGE("[yuv420p] unexpected format %x\n", overlay->format);
  90. return GL_FALSE;
  91. }
  92.  
  93. for (int i = ; i < ; ++i) {
  94. int plane = planes[i];
  95.  
  96. glBindTexture(GL_TEXTURE_2D, renderer->plane_textures[i]);
  97.  
  98. glTexImage2D(GL_TEXTURE_2D,
  99. ,
  100. GL_LUMINANCE,
  101. widths[plane],
  102. heights[plane],
  103. ,
  104. GL_LUMINANCE,
  105. GL_UNSIGNED_BYTE,
  106. pixels[plane]);
  107. }
  108.  
  109. return GL_TRUE;
  110. }

http://blog.csdn.net/liujiakunit/article/details/46899229

2.

  1. /* open a given stream. Return 0 if OK */
  2. static int stream_component_open(FFPlayer *ffp, int stream_index)
  3. {
  4. VideoState *is = ffp->is;
  5. AVFormatContext *ic = is->ic;
  6. AVCodecContext *avctx;
  7. AVCodec *codec = NULL;
  8. const char *forced_codec_name = NULL;
  9. AVDictionary *opts = NULL;
  10. AVDictionaryEntry *t = NULL;
  11. int sample_rate, nb_channels;
  12. int64_t channel_layout;
  13. int ret = ;
  14. int stream_lowres = ffp->lowres;
  15.  
  16. if (stream_index < || stream_index >= ic->nb_streams)
  17. return -;
  18. avctx = avcodec_alloc_context3(NULL);
  19. if (!avctx)
  20. return AVERROR(ENOMEM);
  21.  
  22. ret = avcodec_parameters_to_context(avctx, ic->streams[stream_index]->codecpar);
  23. if (ret < )
  24. goto fail;
  25. av_codec_set_pkt_timebase(avctx, ic->streams[stream_index]->time_base);
  26.  
  27. codec = avcodec_find_decoder(avctx->codec_id);
  28. ...
  29.  
  30. case AVMEDIA_TYPE_VIDEO:
  31. is->video_stream = stream_index;
  32. is->video_st = ic->streams[stream_index];
  33.  
  34. decoder_init(&is->viddec, avctx, &is->videoq, is->continue_read_thread);
  35.  
  36. ...
  37.  
  38. static void decoder_init(Decoder *d, AVCodecContext *avctx, PacketQueue *queue, SDL_cond *empty_queue_cond) {
  39. memset(d, , sizeof(Decoder));
  40. d->avctx = avctx;
  41. d->queue = queue;
  42. d->empty_queue_cond = empty_queue_cond;
  43. d->start_pts = AV_NOPTS_VALUE;
  44.  
  45. d->first_frame_decoded_time = SDL_GetTickHR();
  46. d->first_frame_decoded = ;
  47.  
  48. SDL_ProfilerReset(&d->decode_profiler, -);
  49. }
  1. static int get_video_frame(FFPlayer *ffp, AVFrame *frame)
  2. {
  3. VideoState *is = ffp->is;
  4. int got_picture;
  5.  
  6. ffp_video_statistic_l(ffp);
  7. if ((got_picture = decoder_decode_frame(ffp, &is->viddec, frame, NULL)) < )
  8. return -;
  9.  
  10. ...
  11.  
  1. static int decoder_decode_frame(FFPlayer *ffp, Decoder *d, AVFrame *frame, AVSubtitle *sub) {
  2. int got_frame = ;
  3.  
  4. do {
  5. int ret = -;
  6.  
  7. if (d->queue->abort_request)
  8. return -;
  9.  
  10. if (!d->packet_pending || d->queue->serial != d->pkt_serial) {
  11. AVPacket pkt;
  12. do {
  13. if (d->queue->nb_packets == )
  14. SDL_CondSignal(d->empty_queue_cond);
  15. if (packet_queue_get_or_buffering(ffp, d->queue, &pkt, &d->pkt_serial, &d->finished) < )
  16. return -;
  17. if (pkt.data == flush_pkt.data) {
  18. avcodec_flush_buffers(d->avctx);
  19. d->finished = ;
  20. d->next_pts = d->start_pts;
  21. d->next_pts_tb = d->start_pts_tb;
  22. }
  23. } while (pkt.data == flush_pkt.data || d->queue->serial != d->pkt_serial);
  24. av_packet_unref(&d->pkt);
  25. d->pkt_temp = d->pkt = pkt;
  26. d->packet_pending = ;
  27. }
  28.  
  29. switch (d->avctx->codec_type) {
  30. case AVMEDIA_TYPE_VIDEO: {
  31. ret = avcodec_decode_video2(d->avctx, frame, &got_frame, &d->pkt_temp);
  32. if (got_frame) {
  33. ffp->stat.vdps = SDL_SpeedSamplerAdd(&ffp->vdps_sampler, FFP_SHOW_VDPS_AVCODEC, "vdps[avcodec]");
  34. if (ffp->decoder_reorder_pts == -) {
  35. frame->pts = av_frame_get_best_effort_timestamp(frame);
  36. } else if (!ffp->decoder_reorder_pts) {
  37. frame->pts = frame->pkt_dts;
  38. }
  39. }
  40. }
  41. break;
  42. case AVMEDIA_TYPE_AUDIO:
  43. ret = avcodec_decode_audio4(d->avctx, frame, &got_frame, &d->pkt_temp);
  44. if (got_frame) {
  45. AVRational tb = (AVRational){, frame->sample_rate};
  46. if (frame->pts != AV_NOPTS_VALUE)
  47. frame->pts = av_rescale_q(frame->pts, av_codec_get_pkt_timebase(d->avctx), tb);
  48. else if (d->next_pts != AV_NOPTS_VALUE)
  49. frame->pts = av_rescale_q(d->next_pts, d->next_pts_tb, tb);
  50. if (frame->pts != AV_NOPTS_VALUE) {
  51. d->next_pts = frame->pts + frame->nb_samples;
  52. d->next_pts_tb = tb;
  53. }
  54. }
  55. break;
  56. case AVMEDIA_TYPE_SUBTITLE:
  57. ret = avcodec_decode_subtitle2(d->avctx, sub, &got_frame, &d->pkt_temp);
  58. break;
  59. default:
  60. break;
  61. }
  62.  
  63. if (ret < ) {
  64. d->packet_pending = ;
  65. } else {
  66. d->pkt_temp.dts =
  67. d->pkt_temp.pts = AV_NOPTS_VALUE;
  68. if (d->pkt_temp.data) {
  69. if (d->avctx->codec_type != AVMEDIA_TYPE_AUDIO)
  70. ret = d->pkt_temp.size;
  71. d->pkt_temp.data += ret;
  72. d->pkt_temp.size -= ret;
  73. if (d->pkt_temp.size <= )
  74. d->packet_pending = ;
  75. } else {
  76. if (!got_frame) {
  77. d->packet_pending = ;
  78. d->finished = d->pkt_serial;
  79. }
  80. }
  81. }
  82. } while (!got_frame && !d->finished);
  83.  
  84. return got_frame;
  85. }

3.

  1. /* prepare a new audio buffer */
  2. static void sdl_audio_callback(void *opaque, Uint8 *stream, int len)
  3. {
  4. FFPlayer *ffp = opaque;
  5. VideoState *is = ffp->is;
  6. int audio_size, len1;
  7. if (!ffp || !is) {
  8. memset(stream, , len);
  9. return;
  10. }
  11.  
  12. ffp->audio_callback_time = av_gettime_relative();
  13.  
  14. if (ffp->pf_playback_rate_changed) {
  15. ffp->pf_playback_rate_changed = ;
  16. #if defined(__ANDROID__)
  17. if (!ffp->soundtouch_enable) {
  18. SDL_AoutSetPlaybackRate(ffp->aout, ffp->pf_playback_rate);
  19. }
  20. #else
  21. SDL_AoutSetPlaybackRate(ffp->aout, ffp->pf_playback_rate);
  22. #endif
  23. }
  24. if (ffp->pf_playback_volume_changed) {
  25. ffp->pf_playback_volume_changed = ;
  26. SDL_AoutSetPlaybackVolume(ffp->aout, ffp->pf_playback_volume);
  27. }
  28.  
  29. while (len > ) {
  30. if (is->audio_buf_index >= is->audio_buf_size) {
  31. audio_size = audio_decode_frame(ffp);
  32. ...
  33.  
  34. if (audio_size < ) {
  35. /* if error, just output silence */
  36. is->audio_buf = NULL;
  37. is->audio_buf_size = SDL_AUDIO_MIN_BUFFER_SIZE / is->audio_tgt.frame_size * is->audio_tgt.frame_size;
  38. } else {
  39. if (is->show_mode != SHOW_MODE_VIDEO)
  40. update_sample_display(is, (int16_t *)is->audio_buf, audio_size);
  41. is->audio_buf_size = audio_size;
  42. }
  43. is->audio_buf_index = ;
  44. }
  45. if (is->auddec.pkt_serial != is->audioq.serial) {
  46. is->audio_buf_index = is->audio_buf_size;
  47. memset(stream, , len);
  48. // stream += len;
  49. // len = 0;
  50. SDL_AoutFlushAudio(ffp->aout);
  51. break;
  52. }
  53. len1 = is->audio_buf_size - is->audio_buf_index;
  54. if (len1 > len)
  55. len1 = len;
  56. if (!is->muted && is->audio_buf && is->audio_volume == SDL_MIX_MAXVOLUME)
  57. memcpy(stream, (uint8_t *)is->audio_buf + is->audio_buf_index, len1);
  58. else {
  59. memset(stream, , len1);
  60. if (!is->muted && is->audio_buf)
  61. SDL_MixAudio(stream, (uint8_t *)is->audio_buf + is->audio_buf_index, len1, is->audio_volume);
  62. }
  63. len -= len1;
  64. stream += len1;
  65. is->audio_buf_index += len1;
  66. }
  67. is->audio_write_buf_size = is->audio_buf_size - is->audio_buf_index;
  68. /* Let's assume the audio driver that is used by SDL has two periods. */
  69. if (!isnan(is->audio_clock)) {
  70. set_clock_at(&is->audclk, is->audio_clock - (double)(is->audio_write_buf_size) / is->audio_tgt.bytes_per_sec - SDL_AoutGetLatencySeconds(ffp->aout), is->audio_clock_serial, ffp->audio_callback_time / 1000000.0);
  71. sync_clock_to_slave(&is->extclk, &is->audclk);
  72. }
  73. }
  74.  
  75. static int audio_decode_frame(FFPlayer *ffp)
  76. {
  77. VideoState *is = ffp->is;
  78. int data_size, resampled_data_size;
  79. int64_t dec_channel_layout;
  80. av_unused double audio_clock0;
  81. int wanted_nb_samples;
  82. Frame *af;
  83. int translate_time = ;
  84.  
  85. if (is->paused || is->step)
  86. return -;
  87.  
  88. if (ffp->sync_av_start && /* sync enabled */
  89. is->video_st && /* has video stream */
  90. !is->viddec.first_frame_decoded && /* not hot */
  91. is->viddec.finished != is->videoq.serial) { /* not finished */
  92. /* waiting for first video frame */
  93. Uint64 now = SDL_GetTickHR();
  94. if (now < is->viddec.first_frame_decoded_time ||
  95. now > is->viddec.first_frame_decoded_time + ) {
  96. is->viddec.first_frame_decoded = ;
  97. } else {
  98. /* video pipeline is not ready yet */
  99. return -;
  100. }
  101. }
  102. reload:
  103. do {
  104. #if defined(_WIN32) || defined(__APPLE__)
  105. while (frame_queue_nb_remaining(&is->sampq) == ) {
  106. if ((av_gettime_relative() - ffp->audio_callback_time) > 1000000LL * is->audio_hw_buf_size / is->audio_tgt.bytes_per_sec / )
  107. return -;
  108. av_usleep ();
  109. }
  110. #endif
  111. if (!(af = frame_queue_peek_readable(&is->sampq)))
  112. return -;
  113. frame_queue_next(&is->sampq);
  114. } while (af->serial != is->audioq.serial);
  115. ...
  116.  
  117. if (is->swr_ctx) {
  118. const uint8_t **in = (const uint8_t **)af->frame->extended_data;
  119. uint8_t **out = &is->audio_buf1;
  120. int out_count = (int)((int64_t)wanted_nb_samples * is->audio_tgt.freq / af->frame->sample_rate + );
  121. int out_size = av_samples_get_buffer_size(NULL, is->audio_tgt.channels, out_count, is->audio_tgt.fmt, );
  122. int len2;
  123. if (out_size < ) {
  124. av_log(NULL, AV_LOG_ERROR, "av_samples_get_buffer_size() failed\n");
  125. return -;
  126. }
  127. if (wanted_nb_samples != af->frame->nb_samples) {
  128. if (swr_set_compensation(is->swr_ctx, (wanted_nb_samples - af->frame->nb_samples) * is->audio_tgt.freq / af->frame->sample_rate,
  129. wanted_nb_samples * is->audio_tgt.freq / af->frame->sample_rate) < ) {
  130. av_log(NULL, AV_LOG_ERROR, "swr_set_compensation() failed\n");
  131. return -;
  132. }
  133. }
  134. av_fast_malloc(&is->audio_buf1, &is->audio_buf1_size, out_size);
  135.  
  136. if (!is->audio_buf1)
  137. return AVERROR(ENOMEM);
  138. len2 = swr_convert(is->swr_ctx, out, out_count, in, af->frame->nb_samples);
  139. if (len2 < ) {
  140. av_log(NULL, AV_LOG_ERROR, "swr_convert() failed\n");
  141. return -;
  142. }
  143. if (len2 == out_count) {
  144. av_log(NULL, AV_LOG_WARNING, "audio buffer is probably too small\n");
  145. if (swr_init(is->swr_ctx) < )
  146. swr_free(&is->swr_ctx);
  147. }
  148. is->audio_buf = is->audio_buf1;
  149. int bytes_per_sample = av_get_bytes_per_sample(is->audio_tgt.fmt);
  150. resampled_data_size = len2 * is->audio_tgt.channels * bytes_per_sample;
  151. #if defined(__ANDROID__)
  152. if (ffp->soundtouch_enable && ffp->pf_playback_rate != 1.0f && !is->abort_request) {
  153. av_fast_malloc(&is->audio_new_buf, &is->audio_new_buf_size, out_size * translate_time);
  154. for (int i = ; i < (resampled_data_size / ); i++)
  155. {
  156. is->audio_new_buf[i] = (is->audio_buf1[i * ] | (is->audio_buf1[i * + ] << ));
  157. }
  158.  
  159. int ret_len = ijk_soundtouch_translate(is->handle, is->audio_new_buf, (float)(ffp->pf_playback_rate), (float)(1.0f/ffp->pf_playback_rate),
  160. resampled_data_size / , bytes_per_sample, is->audio_tgt.channels, af->frame->sample_rate);
  161. if (ret_len > ) {
  162. is->audio_buf = (uint8_t*)is->audio_new_buf;
  163. resampled_data_size = ret_len;
  164. } else {
  165. translate_time++;
  166. goto reload;
  167. }
  168. }
  169. #endif
  170. } else {
  171. is->audio_buf = af->frame->data[];
  172. resampled_data_size = data_size;
  173. }

第11月第8天 ffmpeg ffplay的更多相关文章

  1. 音频相关 ALSA ffmpeg ffplay 命令用法 g7xx

    采样率: samples 441100 每秒 DAC/ADC 采样的频率,声卡一般还支持 48k 8k 等模式. 通道:channels 2声道 左右声道 也有单声道的声音,5.1 声道 位数: 16 ...

  2. psp进度(11月25号-31号)

    本周psp进度 11月25号 内容 开始时间 结束时间 打断时间 净时间 处理数据集  9:27  11:34  12m  115m 11月27号 内容 开始时间 结束时间 打断时间 净时间  scr ...

  3. 本周psp(11月17-23)

    本周psp进度 11月19号 内容 开始时间 结束时间 打断时间 净时间 发布读书笔记 11:05 11:25 0 20m 看构建之法书 9:50 10:48 5m 53m 11月20号 内容 开始时 ...

  4. Autodesk 2013开发者日(DevDays)又要来了 -- 北京(2013年11月7日)和上海(2013年11月11日)

    各位, 一年一度的Autodesk 开发者日(Devdays)开始注册了,抓紧时间前排占座! 注册地址: www.autodesk.com.cn/adndevday2013 今年开发者日的主题:革命性 ...

  5. GTAC 2015将于11月10号和11号召开

    今年的GTAC注册已经结束,将会在11月10号和11号在Google马萨诸塞州剑桥办公室召开.大家可以关注https://developers.google.com/google-test-autom ...

  6. 11月30日《奥威Power-BI智能分析报表制作方法》腾讯课堂开课啦

    这么快一周就过去了,奥威公开课又要与大家见面咯,上节课老师教的三种报表集成方法你们都掌握了吗?大家都知道,学习的结果在于实际应用,想要熟练掌握新内容的要点就在于去应用它.正是基于这一要点,每一期的课程 ...

  7. 补psp进度(11月4号-9号)

    这周psp进度 11月4号 内容 开始时间 结束时间 打断时间 净时间 小伙伴聊天实现 9:45 10:49 0 64m 学习HttpURLConnection 14:13 15:48 10m 85m ...

  8. MySQL_杭州11月销售昨日未上架的SKU_20161212

    #C034杭州11月销售昨日未上架的SKU SELECT 城市,a.订单日期,a.客户数,a.订单数,b.产品数,a.金额,c.销售确认额,c.毛利额,c.毛利率 FROM ( SELECT 城市,订 ...

  9. 11月23日《奥威Power-BI报表集成到其他系统》腾讯课堂开课啦

    听说明天全国各地区都要冷到爆了,要是天气冷到可以放假就好了.想象一下大冷天的一定要在被窝里度过才对嘛,索性明天晚上来个相约吧,相约在被窝里看奥威Power-BI公开课如何?        上周奥威公开 ...

随机推荐

  1. 猎豹CEO傅盛:95%的人碌碌无为,只是不懂这一点!

      我一直在思索,怎么才能让一家公司更快地成长?一个人怎么才能从一群人的竞争当中脱颖而出? 1. 人的四种认知状态 最近我看了一幅图,我在其上加了一个数字注脚. 这是一个人认知的四种状态——“不知道自 ...

  2. Alpha 冲刺二

    团队成员 051601135 岳冠宇 051604103 陈思孝 031602629 刘意晗 031602248 郑智文 031602234 王淇 会议照片 项目燃尽图 项目进展 暂无进展, 项目描述 ...

  3. 获取移动端 touchend 事件中真正触摸点下方的元素

    移动端的touchstart, touchmove, touchend三个事件,拖动元素结束时,获取到了touchend事件, 但是event.touches[0].target所指向的元素却是tou ...

  4. 安装spring-tool-suite插件

    spring-tool-suite是一个非常好用的spring插件,由于eclipse是一个很简洁的IDE,因此许多插件,需要我们自己去手动下载.而Spring-tool-suite插件即是其中之一. ...

  5. 安装 oracle

    先下载3个东西:链接忘记了,大家自己找一下 1  ORA+11+G+R2+server+64bit+for+windows.iso  (oracle 安装文件) 2  PLSql 3  oracle6 ...

  6. Spring中ClassPathXmlApplication与FileSystemXmlApplicationContext的区别以及ClassPathXmlApplicationContext 的具体路径

    一.ClassPathXmlApplicationContext 的具体路径 String s[] = System.getProperty("java.class.path"). ...

  7. MT【203】连续型的最值

    (北大自招)已知$-6\le x_i\le 10 (i=1,2,\cdots,10),\sum\limits_{i=1}^{10}x_i=50,$当$\sum\limits_{i=1}^{10}x^2 ...

  8. 洛谷P4180 [BJWC2010]次小生成树(最小生成树,LCT,主席树,倍增LCA,倍增,树链剖分)

    洛谷题目传送门 %%%TPLY巨佬和ysner巨佬%%% 他们的题解 思路分析 具体思路都在各位巨佬的题解中.这题做法挺多的,我就不对每个都详细讲了,泛泛而谈吧. 大多数算法都要用kruskal把最小 ...

  9. 网络传输---HttpURLConnection

    HttpURLConnection是java做网络传输的一种,一般用于做数据的传输如xml数据传输 1.创建及配置: 1.1创建一个url对象,并指定url的地址 URL url = new URL( ...

  10. 【codevs1245】最小的 N 个和

    题目大意:给定两个有 N 个数字的序列,从这两个序列中任取一个数相加,共有 \(N^2\) 个和,求这些和中最小的 N 个. 题解:由于数据量是 10W,必须减少每次选取的决策集合中元素的个数.可以发 ...